【问题标题】:TypeScript type error with type string|number|null but not with string|numberTypeScript 类型错误,类型为 string|number|null,但不是 string|number
【发布时间】:2019-01-11 20:54:05
【问题描述】:

为什么函数fooreturn value;行报错Type 'string | number' is not assignable to type 'string'. Type 'number' is not assignable to type 'string'.而函数bar按预期工作?

TypeScript Playground

function foo(value: string | number | null): string | null {
    if (typeof value !== 'string' && value !== null) {
        throw new Error();
    }

    return value;
}

function bar(value: string | number): string {
    if (typeof value !== 'string') {
        throw new Error();
    }

    return value;
}

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您的代码不会在 Typescript 3.2.2 中通过严格的 null 检查引发类型错误。

    function foo(value: string | number | null): string | null {
        //value has type `string | number | null`
        if (typeof value !== 'string' && /*value has type `number | null` */ value !== null) {
            //value has type `number`
            throw new Error();
        }
        //value has type `string | null`
    
        return value;
    }
    

    【讨论】:

    • 我完全期望您描述的类型,但我 100% 确定我在 TypeScript Playground 中遇到了类型错误。你用我的共享网址测试了吗?
    • 看起来关键因素是启用严格的空检查。我从来没有真正想到禁用严格的空检查实际上会导致类型错误。当严格的空检查被禁用时,字符串和数字基本上都被视为“可空”类型。因此,检查 value !== null 无法在类型检查中隔离数字。
    • 实际上相当令人困惑的是,如果没有严格的 null 检查,实际上检查 null 的代码会失败。
    猜你喜欢
    • 2020-06-19
    • 2021-11-16
    • 1970-01-01
    • 2020-06-19
    • 2020-04-04
    • 2021-07-02
    • 2021-06-28
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多