各位大佬,假设有这样一个 IMessage 的 interface,然后需要通过 type 的值来推断 value 的值。有这种可能性吗
enum MessageEnum{ IMAGE:'image', Text:'text' }
interface IMessage{ type:MessageEnum, value:IMessageContentMap[这里是 type 的值] }
interface IMessageContentMap{ [MessageEnum.IMAGE]:string; [MessageEnum.Text]:number; }
1
noe132 2021-07-26 15:57:52 +08:00
interface A { type: 'A', data: number }
interface B { type: 'B', data: string } if (a.type === 'B') { a.data // number } 以你的例子 enum MessageEnum { IMAGE = 'image', Text = 'text' } interface IMessage <T extends MessageEnum>{ type: T, value: IMessageContentMap[T] } interface IMessageContentMap { [MessageEnum.IMAGE]: string [MessageEnum.Text]: number } let a = <T extends MessageEnum>(p: IMessage<T>) => {} a({ type: MessageEnum.Text, value: 2, }) a({ type: MessageEnum.Text, value: 2, // Type 'string' is not assignable to type 'number'. }) |
2
noe132 2021-07-26 15:58:29 +08:00
第 5 行写错了,应该是 a.data // string
|
3
aguesuka 2021-07-26 16:12:12 +08:00
IMessage 你要的就是是经典的 Dependent pair types (Sigma-type), 它是 dependent type, 中文依值类型, 可以将第一个项作为第二个项的类型 (allow the type of the second component of a pair
to vary depending on the choice of the first component.) |
4
aguesuka 2021-07-26 16:12:52 +08:00
据我所知没有支持依赖类型的工业语言
|
5
johnwood 2021-07-26 16:23:19 +08:00
type IMessage =
| { type: MessageEnum.IMAGE; value: string; } | { type: MessageEnum.Text; value: number; }; |