Ale*_*lls 19 typescript typescript2.0
有没有办法让TypeScript静态检查空字符串?有没有办法静态要求将非空字符串传递给函数?
let fn = function(a:string){
};
fn('');
Run Code Online (Sandbox Code Playgroud)
要么
let a = '';
fn(a);
Run Code Online (Sandbox Code Playgroud)
TS可以帮助我们吗?
Rob*_*Rob 16
我相信这就像你只使用打字系统一样接近(而不是使用'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.
}
Run Code Online (Sandbox Code Playgroud)
测试它:
let fn = function(a: nonEmptyString) {
}
let someStr = '';
if (isNonEmptyString(someStr)) {
fn(someStr); // Valid
} else {
fn(someStr); // Compile error
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,你最终疣,因为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)
}
Run Code Online (Sandbox Code Playgroud)
一种可能的决议是:
type nonEmptyString = string & { __nonEmptyStr: never };
Run Code Online (Sandbox Code Playgroud)
这减轻了必须显式转换回字符串的问题(上面的所有三个测试都是有效的),但确实污染了类型__nonEmptyStr(undefined如果被引用的话).
您可以在特定情况下使用此技巧:
function fn<T extends string>(a: T extends '' ? never : T) {
// But TypeScript won't know here that !!a === true
}
fn(''); // Error
fn('foo'); // No error
Run Code Online (Sandbox Code Playgroud)