TypeScript是否有办法静态检查空字符串?有没有办法静态要求将非空字符串传递给函数?
let fn = function(a:string){
};
fn('');
或
let a = '';
fn(a);
TS可以帮助我们吗?
答案 0 :(得分:13)
我相信这就像你只使用打字系统一样接近(而不是使用'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)
}
一种可能的解决方案是:
type nonEmptyString = string & { __nonEmptyStr: never };
这减轻了必须显式转换回字符串的问题(上面的所有三个测试都是有效的),但确实用__nonEmptyStr
污染了类型(如果被引用将会undefined
)。< / p>
答案 1 :(得分:3)
您可以使用重载来输入它,例如在""
上提供错误的返回类型,这会在您在其他地方使用时立即出错:
type MyFnType = {
(a: "") => never;
(a: string) => whatever;
}
function fn: MyFnType = ...
答案 2 :(得分:1)
!a
答案必须至少包含30个字符,因此答案很长:
您可以使用!a
来检查a
是否为空字符串。
答案 3 :(得分:0)
您可以在特定情况下使用此技巧:
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
答案 4 :(得分:0)
转到项目中的 tsconfig.json 在 "strict":true,
"strictNullChecks": false,
它将解决您的问题
答案 5 :(得分:-1)
下面的代码片段可控制字符串是否为空,以及是否有空字符串
private checkRequired(text:string){
if(text == null) return false;
let n = text.length;
for (let i = 1; i < n; i++){
if (text[i] !== " "){
return true;
}
}
return false;
}
if(this.checkRequired("bla bla blast")){
... do your stuff
}
答案 6 :(得分:-1)
为此,我使用模式!value?.trim()
。
运行my code snippet来查看实际效果。
该值未定义或为空时,表达式将返回true
。
它类似于C#等效的string.IsNullOrEmpty(value)
。