【问题标题】:Typescript generic type default when not being usedTypescript 泛型类型默认不使用时
【发布时间】:2018-11-30 08:43:57
【问题描述】:

我有一个类似这样的界面:

interface ISomething<TMulti extends object> {
    value: number | string;
    text: string | TMulti;
}

文本部分可以是简单的字符串,也可以是实现某些特定接口的对象映射。在大多数情况下,它只是一个简单的不可为空的字符串,所以我想将TMulti 泛型类型默认设置为使用此接口的东东。我的选择是

  • {}
  • null
  • never

最好的选择似乎是never,但我从未见过它被用作通用类型默认值,我不确定string | never 的类型实际上意味着什么?是否与string 相同?其他两个选项,请允许我将 text 的值设置为某个不需要的值。

问题是:never 类型可以用作默认的泛型类型吗?这种情况是什么意思?

补充说明:我在严格模式下使用 Typescript,所以 string 根据编译器要求不能为空,这也是我想要的。

【问题讨论】:

    标签: typescript generics


    【解决方案1】:

    是的,您可以使用 never 作为默认值:

    interface ISomething<TMulti extends object = never> {
        value: number | string;
        text: string | TMulti;
    }
    
    const a: ISomething = {
        value: 'str',
        text: 'str'
    }
    
    const b: ISomething<{ example: string }> = {
        value: 2,
        text: {
            example: 'str'
        }
    }
    

    上面的例子表明,如果你不指定类型,它就知道text 应该是一个字符串。所以never 是一个不错的选择,你应该对此表示祝贺,因为我觉得只是确认你的正确建议是欺诈性的。

    【讨论】:

    • 可能有用,PR 介绍永远不会:github.com/Microsoft/TypeScript/pull/8652。你可以在那里找到:因为 never 是每个类型的子类型,所以它总是从联合类型中省略,并且只要有其他类型被返回,它就会在函数返回类型推断中被忽略。
    • 那么ISomething&lt;TMulti extends object = never&gt; 中的属性会发生什么情况,该属性将具有属性manNotBe: TMulti。这是否意味着当TMultinever 时该属性不存在?
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2019-05-30
    • 2021-12-06
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多