TypeScript有没有办法静态判断空字符串?有没有一种方法可以静态地要求将非空字符串传递给函数?
let fn = function(a:string){
};
fn('');
或
let a = '';
fn(a);
在这能帮我们吗?
TypeScript有没有办法静态判断空字符串?有没有一种方法可以静态地要求将非空字符串传递给函数?
let fn = function(a:string){
};
fn('');
或
let a = '';
fn(a);
在这能帮我们吗?
我相信这是你只需要使用打字系统(而不是"非空"类)就能做到的
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)
}
一个可能的解决方案是:
type nonEmptyString = string & { __nonEmptyStr: never };
这缓解了必须显式强制转换回字符串的问题(上面的三个测试都是有效的),但会用__nonEmptyStr
(如果被引用,将是undefined
)污染类型.