[英]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.