TypeScript检查空字符串

Ale*_*lls 19 typescript typescript2.0

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

let fn = function(a:string){

};

fn('');
Run Code Online (Sandbox Code Playgroud)

要么

let a = '';
fn(a);
Run Code Online (Sandbox Code Playgroud)

TS可以帮助我们吗?

Rob*_*Rob 16

我相信这就像你只使用打字系统一样接近(而不是使用'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.
}
Run Code Online (Sandbox Code Playgroud)

测试它:

let fn = function(a: nonEmptyString) {

}

let someStr = '';
if (isNonEmptyString(someStr)) {
    fn(someStr); // Valid
} else {
    fn(someStr); // Compile error
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,你最终疣,因为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)
}
Run Code Online (Sandbox Code Playgroud)

一种可能的决议是:

type nonEmptyString = string & { __nonEmptyStr: never };
Run Code Online (Sandbox Code Playgroud)

这减轻了必须显式转换回字符串的问题(上面的所有三个测试都是有效的),但确实污染了类型__nonEmptyStr(undefined如果被引用的话).


Fin*_*sse 5

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

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
Run Code Online (Sandbox Code Playgroud)

  • 该问题的唯一正确答案。它完全有效,并且不涉及静态类型检查。 (5认同)
  • 您可以将其转换为实用程序类型 `type NonEmptyString&lt;T&gt; = T extends '' ?从来没有:T` (2认同)