TypeScript检查空字符串

时间:2017-06-22 01:51:06

标签: typescript typescript2.0

TypeScript是否有办法静态检查空字符串?有没有办法静态要求将非空字符串传递给函数?

let fn = function(a:string){

};

fn('');

let a = '';
fn(a);

TS可以帮助我们吗?

7 个答案:

答案 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
}

不幸的是,由于nonEmptyStringnever,您最终会感染疣。这意味着您需要明确地将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)