microsoft / microsoft/TypeScript
Suggestion: Type-check statement to verify type assignability
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 132
Description
Search Terms
type check statement compile (compilation) time
Suggestion
I wanted to check compatibilities for types from different (especially external) modules in compilation time.
import { SomeType } from 'some-external';
// ... something statement here to check if SomeType is not changed
// by update for 'some-external' or etc.
To solve it, I suggest to add type-check statement like following:
// Compile error if 'SomeType' does not satisfy the constraint 'WantedType'
// (similar to error TS2344)
type assert SomeType extends WantedType;
// The message "Unexpected 'SomeType'" will be output if the error occurs
// - The trailing expression (message clause) must be a valid string literal
// (the message clause is not necessary for this suggestion
// but would make easier to solve the error...)
type assert SomeType extends WantedType, "Unexpected 'SomeType'";
- The type-check process should be same as the process for type constraints in type parameters.
- There is already
typestatement, but the above statements are not conflicted becausetypestatements requires=after BindingIdentifier (or TypeParameters). - Similar to #10421, but this
type assertonly check types; it does not cast variables. extendskeyword may confuse to one used in conditional type. (not ambiguous?)- For
type assert A extends B, bothAandBshould accept conditional type.
- For
- (
type assertis somewhat inspired by other languages'assertstatements (especiallystatic_assertin C/C++), but I don't know whether the wordstype assertare the best...)
Use Cases
- Check compatibilities for types simply and easily
- Useful to avoid using incompatible package versions with another packages/modules.
- Assert types explicitly with more human-readable
- This would not be useful for compilers/implementers, but would be useful for developers to read codes.
- Test type definition (e.g. for unit test)
Currently we can check types statically as following:
import { SomeType } from 'some-external';
// Helper definition to check type
type TypeCheckerOfWantedType<T extends WantedType> = T;
// Error if 'SomeType' does not satisfy 'WantedType'
type CheckResultForSomeType = TypeCheckerOfWantedType<SomeType>;
// this is necessary to avoid "'CheckResultForSomeType' is declared but never used"
declare global { var _dummyVariableForCheckSomeType: CheckResultForSomeType; }
While no JavaScript codes are generated from this code, this is more complex to check.
Examples
// Must not be an error
type assert Element extends Node;
// Error in 'es5', pass in 'es2015'
type assert ObjectConstructor extends { assign: (...args: any[]) => any; },
'Object.assign() is not available';
import { User } from 'db-library';
// Error if User does not have 'id' member with type assignable to 'number'
type assert User extends { id: number; }, 'Unexpected User type';
const a = someFunction();
if (typeof a === 'string') {
// treat 'a' as 'string'
} else {
// Error if narrowed type of 'a' does not have '{ data: string }'
type assert typeof a extends { data: string; };
// (this assert does not mean that type of 'a' is treated as '{ data: string }' here)
}
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par examiner la syntaxe proposée de type assert, son comportement en matière de contraintes de type, les cas de types conditionnels et son interaction avec les instructions type existantes. Comparez la proposition avec l’architecture actuelle de vérification des types et d’analyse syntaxique, puis définissez des tests pour les assertions acceptées, les erreurs d’assignabilité, les messages facultatifs et les expressions dont le type est affiné ; le travail est considéré comme terminé lorsque la syntaxe est spécifiée et que son comportement est couvert.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 25/100