【问题标题】:TypeScript check for empty stringTypeScript 检查空字符串
【发布时间】:2017-11-25 02:38:12
【问题描述】:

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

let fn = function(a:string){

};

fn('');

let a = '';
fn(a);

TS 可以在这里帮助我们吗?

【问题讨论】:

    标签: typescript typescript2.0


    【解决方案1】:

    我相信这与您仅使用打字系统(而不是使用“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)。

    【讨论】:

    • 也许我们需要一个带有 toString 方法的对象,这也可以,只是一种不同类型的解决方案。
    • 除了我认为所有对象都有 toString 方法...嗯。
    • 为什么不直接使用string 类型然后:const isNotBlank = (str?: string|null): str is string =&gt; (str !== undefined &amp;&amp; str !== null &amp;&amp; str.trim().length &gt; 0)?真正的问题 - 这种方法有什么问题?。
    • @Anoiny 这用于检查它是否不为空,但是你将如何使用它来定义一个需要非空字符串的函数?
    【解决方案2】:

    您可以在特定情况下使用此技巧:

    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
    

    【讨论】:

    • 这个问题的唯一正确答案。它完全有效,不涉及静态类型检查。
    【解决方案3】:

    您可能会使用重载键入它,例如在 "" 上给出错误的返回类型,这会在您在其他地方使用它时立即出错:

    type MyFnType = {
      (a: "") => never;
      (a: string) => whatever;
    }
    
    function fn: MyFnType = ...
    

    【讨论】:

    • 由于某种原因,上面的语法没有编译,但我同意解决方案
    • 此解决方案有效,但如前所述,此示例无法编译。这是一个示例:codesandbox.io/s/jnbu6 - 它确实功能重载,例如function fn(s: ''): never; function fn(s: string): string; function fn(s: string | '') {/* do the real work here *}
    【解决方案4】:

    您可以使用!a 来检查a 是否为空字符串。

    【讨论】:

    • 不是答案,因为问题是关于 TypeScript 中的静态类型检查,而不是 JavaScript 中的运行时检查。
    【解决方案5】:

    下面的代码片段控制字符串是否为空以及是否有空格字符串

    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】:

      在您的项目中转到 tsconfig.json 在"strict":true, 下添加此代码

      "strictNullChecks": false, 会解决你的问题

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 2018-11-28
        • 1970-01-01
        • 2014-02-20
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 2016-12-27
        相关资源
        最近更新 更多