TypeScriptが空の文字列を静的にチェックする方法はありますか?空でない文字列を静的に関数に渡す必要がある方法はありますか?
let fn = function(a:string){
};
fn('');
または
let a = '';
fn(a);
ここでTSが役立ちますか?
これは、( '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
}
残念ながら、nonEmptyString
はnever
であるため、いぼができます。つまり、nonEmptyString
を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)
}
1つの可能な解決策は次のとおりです。
type nonEmptyString = string & { __nonEmptyStr: never };
これは明示的に文字列にキャストバックする必要があるという問題を軽減します(上記の3つのテストはすべて有効です)が、__nonEmptyStr
(参照されるとundefined
になります)で型を汚染します。
おそらく、""
他の場所で使用するとすぐにエラーが発生します。
type MyFnType = {
(a: "") => never;
(a: string) => whatever;
}
function fn: MyFnType = ...