web-dev-qa-db-fra.com

TypeScript vérifier la chaîne vide

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?

19
Alexander Mills

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é).

16
Rob

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 = ...
3
Tycho