我想根據另一個屬性的值限制一個物件屬性的型別:
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];
}
但在這種情況下,型別檢查停止作業。
操場
編輯:理想情況下,我根本不希望“LinkedTypesSample”公開型別引數。我只想表達一個簡單的想法:根據另一個屬性的值或型別,一個屬性必須具有某種型別。
uj5u.com熱心網友回復:
您可以嘗試分配條件型別。基本上分兩步創建型別:
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
}
操場。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/317157.html
標籤:打字稿
下一篇:FP-TS分支(面向鐵路的編程)
