【发布时间】:2017-11-25 02:38:12
【问题描述】:
TypeScript 有没有办法静态检查空字符串?有没有办法静态要求将非空字符串传递给函数?
let fn = function(a:string){
};
fn('');
或
let a = '';
fn(a);
TS 可以在这里帮助我们吗?
【问题讨论】:
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)
}
一种可能的解决方法是:
type nonEmptyString = string & { __nonEmptyStr: never };
这缓解了必须显式转换回字符串的问题(上述所有三个测试都有效),但确实会使用__nonEmptyStr 污染类型(如果引用它将是undefined)。
【讨论】:
string 类型然后:const isNotBlank = (str?: string|null): str is string => (str !== undefined && str !== null && str.trim().length > 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
【讨论】:
您可能会使用重载键入它,例如在 "" 上给出错误的返回类型,这会在您在其他地方使用它时立即出错:
type MyFnType = {
(a: "") => never;
(a: string) => whatever;
}
function fn: MyFnType = ...
【讨论】:
function fn(s: ''): never; function fn(s: string): string; function fn(s: string | '') {/* do the real work here *}
您可以使用!a 来检查a 是否为空字符串。
【讨论】:
下面的代码片段控制字符串是否为空以及是否有空格字符串
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
}
【讨论】:
在您的项目中转到 tsconfig.json 在"strict":true, 下添加此代码
"strictNullChecks": false, 会解决你的问题
【讨论】: