Typescript推断类型参数



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

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];
}

但是在这种情况下type检查停止工作

游乐场

编辑理想情况下,我不希望'LinkedTypesSample'暴露类型参数。我只是想表达一个简单的想法:根据另一个属性的值或类型,一个属性必须有一定的类型。

你可以试试分配条件类型。基本上分两步创建类型:

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
}

操场。

相关内容

  • 没有找到相关文章

最新更新