2

我有一个实用函数来检查变量是否为空或未定义,如果输入变量通过检查,我希望 TypeScript 缩小输入变量的范围,例如:

public init(input?: string): void {
    function isSpecified(input: any): boolean {
        return (typeof input !== "undefined") && (input !== null);
    }

    if (isSpecified(input)) {
        let copiedString: string = input; // <-- Error; input is still 'string | undefined'
    }
}

正如您所看到的,TS 并没有消除字符串存在的可能性,undefined即使该函数在逻辑上使之成为不可能。有没有办法让这个函数调用缩小块input内的范围if

4

3 回答 3

6

您可以使用通用类型保护函数:

public init(input?: string): void {
    function isSpecified<T>(input: null | undefined | T): input is T {
        return (typeof input !== "undefined") && (input !== null);
    }

    if (isSpecified(input)) {
        let copiedString: string = input; // OK
    }
}
于 2017-10-25T14:56:52.363 回答
2

是的,您基本上只是编写了一个 typeguard 函数而没有添加 typeguard。

改变:

function isSpecified(input: any): boolean

至:

function isSpecified(input: any): input is string

更一般地说,您可以使用同一事物的通用版本,正如 Ryan 所提到的

function isSpecified<T>(input: null | undefined | T): input is T
于 2017-10-25T14:54:36.830 回答
0

虽然其他答案中建议的类型保护功能在许多情况下都能很好地工作,但在这种情况下,您还有另一个更简单的选择。而不是(typeof input !== "undefined") && (input !== null)只检查内联检查input != null.

很容易忘记,有时由 double equal 完成的类型转换==实际上!=很有用:

function init(input?: string): void {
    if (input != null) {
        let copiedString: string = input; // <-- input is now 'string'
    }
}

在 javascript 或 typescript 中,以下都是true

undefined == null
null == null
'' != null
于 2017-10-25T15:54:02.517 回答