[英]In Typescript, how can I define a class interface containing a property member that is a discriminated union type?
這是我要實現的目標的簡化示例:
export enum DISPLAY_MODE {
MULTI = "multi",
SOLITARY = "solitary"
}
interface MultiAssetDefinition {
displayMode: DISPLAY_MODE.MULTI;
items: string[];
}
interface SolitaryAssetDefinition {
displayMode: DISPLAY_MODE.SOLITARY;
item: string;
}
type AssetDefinition = SolitaryAssetDefinition | MultiAssetDefinition;
const assets: AssetDefinition[] = [
{ displayMode: DISPLAY_MODE.MULTI, items: ["a", "b"] },
{ displayMode: DISPLAY_MODE.SOLITARY, item: "a" }
];
interface AssetDefiner {
assetDefinition: AssetDefinition;
}
class AssetHolder implements AssetDefiner {
assetDefinition = {
displayMode: DISPLAY_MODE.MULTI,
items: ["a", "b"]
};
}
assets
的定義正確地斷言了數組成員的類型。 但是,在 class 定義中,類型檢查器抱怨DISPLAY_MODE.MULTI
不是DISPLAY_MODE
類型。 這是一個現場復制: https://codesandbox.io/s/discriminate-union-class-interface-issue-8buqq?file=/src/index.ts
我是否正在嘗試做一些 TS 做不到的事情? 我可以通過其他方式實現嗎?
當您顯式鍵入屬性時它會起作用:
class AssetHolder implements AssetDefiner {
assetDefinition: AssetDefinition = {
displayMode: DISPLAY_MODE.MULTI,
items: ["a", "b"]
};
}
對於另一個選項:
export enum DISPLAY_MODE {
MULTI = "multi",
SOLITARY = "solitary"
}
interface MultiAssetDefinition {
displayMode: DISPLAY_MODE.MULTI;
items: readonly string[];
}
interface SolitaryAssetDefinition {
displayMode: DISPLAY_MODE.SOLITARY;
item: string;
}
type AssetDefinition = SolitaryAssetDefinition | MultiAssetDefinition;
interface AssetDefiner {
assetDefinition: AssetDefinition;
}
class AssetHolder implements AssetDefiner {
assetDefinition = {
displayMode: DISPLAY_MODE.MULTI,
items: ["a", "b"]
} as const;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.