【问题标题】:TypeScript defaultIfUndefined function typingTypeScript defaultIfUndefined 函数类型
【发布时间】:2019-06-06 10:08:39
【问题描述】:

我正在尝试编写一个简单的函数,它返回一个defaultValue,如果是value === undefined

功能超级简单:

const defaultIfUndefined = (value, defaultValue) => {
    return value === undefined ? defaultValue : value;
}

但是打字/类型推断不起作用。

该函数应该简单地从类型中删除undefined

我尝试了几种不同的方法,但总是有一些错误。

1.

const defaultIfUndefined = <T>(value: T, defaultValue: Exclude<T, undefined>): Exclude<T, undefined> => {
    return value === undefined ? defaultValue : value;
}

2.

const defaultIfUndefined = <T, U extends Exclude<T, undefined>>(value: T, defaultValue: U): U => {
    return value === undefined ? defaultValue : value;
}

3.

const defaultIfUndefined = <T, U extends T | undefined>(value: U, defaultValue: Exclude<U, undefined>): Exclude<U, undefined> => {
    return value === undefined ? defaultValue : value;
}

4.

const defaultIfUndefined = <T, U extends T | undefined, V extends Exclude<U, undefined>>(value: U, defaultValue: V): V => {
    return value === undefined ? defaultValue : value;
}

第一个例子运行良好,只要我return ... as any

但是如果没有as any,有什么方法可以让它工作吗?

--

Link 到 TypeScript Playground

【问题讨论】:

    标签: typescript generics type-inference typescript-generics


    【解决方案1】:

    包含未解析类型参数的条件类型通常需要类型断言。这是因为 typescript 并没有对这些类型做太多的数学运算,它只是检查条件类型的完全匹配。

    一种解决方案是避免使用条件类型:

    const defaultIfUndefined = <T>(value: T | undefined | null, defaultValue: T & {}): T => {
      return value || defaultValue;
    }
    
    let a : string | null = Math.random() > 0.5 ? "" : null;
    let aNotNull = defaultIfUndefined(a, "") // string 
    

    请注意T &amp; {}。如果你把它改成T,打字稿在推断文字类型时会过于激进,&amp; {} 解决了这个问题。

    【讨论】:

    • 谢谢。 &amp; {} 成功了! fn = &lt;T&gt;(value: T | undefined, defaultValue: T &amp; {}): T =&gt; { return value === undefined ? defaultValue : value; } 按预期工作。
    猜你喜欢
    • 2018-07-03
    • 2012-10-25
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2020-10-26
    • 2021-07-08
    相关资源
    最近更新 更多