Existe-t-il un moyen pour TypeScript de vérifier de manière statique si une chaîne est vide? Existe-t-il un moyen d'exiger de manière statique qu'une chaîne non vide soit transmise à une fonction?
let fn = function(a:string){
};
fn('');
ou
let a = '';
fn(a);
Est-ce que TS peut nous aider ici?
Je crois que c'est aussi proche que vous allez utiliser uniquement le système de dactylographie (plutôt que d'avoir une classe 'nonEmptyString')
type nonEmptyString = never; // Cannot be implicitly cast to
function isNonEmptyString(str: string): str is nonEmptyString {
return str && str.length > 0; // Or any other logic, removing whitespace, etc.
}
Le tester:
let fn = function(a: nonEmptyString) {
}
let someStr = '';
if (isNonEmptyString(someStr)) {
fn(someStr); // Valid
} else {
fn(someStr); // Compile error
}
Malheureusement, vous vous retrouvez avec des verrues puisque nonEmptyString
est never
. Ce qui signifie que vous devez explicitement rediffuser nonEmptyString
vers string
.
let fn = function(a: nonEmptyString) {
let len = a.length; // Invalid
let len2 = (<string>a).length; // Valid
let str = a + 'something else'; // Valid (str is now typed as string)
}
Une résolution possible est:
type nonEmptyString = string & { __nonEmptyStr: never };
Ce qui élimine le problème de devoir reconvertir explicitement en chaîne (les trois tests ci-dessus sont valides), mais pollue le type avec __nonEmptyStr
(qui sera undefined
si référencé).
Vous pourriez peut-être le taper avec des surcharges, par exemple pour donner un mauvais type de retour sur ""
qui fera des erreurs dès que vous l’utiliserez ailleurs:
type MyFnType = {
(a: "") => never;
(a: string) => whatever;
}
function fn: MyFnType = ...