web-dev-qa-db-ja.com

空の文字列のTypeScriptチェック

TypeScriptが空の文字列を静的にチェックする方法はありますか?空でない文字列を静的に関数に渡す必要がある方法はありますか?

let fn = function(a:string){

};

fn('');

または

let a = '';
fn(a);

ここでTSが役立ちますか?

19
Alexander Mills

これは、( '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.
}

それをテストする:

let fn = function(a: nonEmptyString) {

}

let someStr = '';
if (isNonEmptyString(someStr)) {
    fn(someStr); // Valid
} else {
    fn(someStr); // Compile error
}

残念ながら、nonEmptyStringneverであるため、いぼができます。つまり、nonEmptyStringstringに明示的にキャストする必要があります。

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)
}

1つの可能な解決策は次のとおりです。

type nonEmptyString = string & { __nonEmptyStr: never };

これは明示的に文字列にキャストバックする必要があるという問題を軽減します(上記の3つのテストはすべて有効です)が、__nonEmptyStr(参照されるとundefinedになります)で型を汚染します。

16
Rob

おそらく、""他の場所で使用するとすぐにエラーが発生します。

type MyFnType = {
  (a: "") => never;
  (a: string) => whatever;
}

function fn: MyFnType = ...
3
Tycho