【问题标题】:Typescript infer type parameter打字稿推断类型参数
【发布时间】:2021-10-15 11:18:38
【问题描述】:

我想根据另一个属性的值来限制一个对象属性的类型:

type DataType = "string"|"number"|"date";

type DataTypeMapping = {
    "string": string;
    "number": number;
    "date": string;
}

interface LinkedTypesSample <T extends DataType> {
    typ: T;
    value: DataTypeMapping[T];
}

现在我可以像这样创建类型检查对象:

const stringInstance: LinkedTypesSample<"string"> = {
    typ: "string",
    value: "abc"
}

const numberInstance: LinkedTypesSample<"number"> = {
    typ: "number",
    value: 1
}

问题是 - 是否可以跳过 LinkedTypesSample 的类型参数? 看起来类型参数可能是从typ 推断出来的。

我试图指定(天真的)默认类型参数,如下所示:

interface LinkedTypesSample <T extends DataType = DataType> {
    typ: T;
    value: DataTypeMapping[T];
}

但在这种情况下,类型检查会停止工作。

Playground

编辑:理想情况下,我根本不希望“LinkedTypesSample”公开类型参数。我只是想表达一个简单的想法:一个属性必须根据另一个属性的值或类型具有某种类型。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    你可以试试distributive conditional type。基本上分两步创建类型:

    type MapType<U> = U extends DataType ? {
        typ: U,
        value: DataTypeMapping[U]
     } : never;
    
    type LinkedTypesSample = MapType<DataType>;
    
    // works
    const stringInstance: LinkedTypesSample = {
        typ: "string",
        value: "abc"
    }
    
    const numberInstance: LinkedTypesSample = {
        typ: "number",
        value: 1
    }
    
    // error
    const stringInstance2:  LinkedTypesSample = {
        typ: 'string',
        value: 1
    }
    

    playground.

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 2018-06-09
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2020-12-20
      • 2016-08-03
      相关资源
      最近更新 更多