打字稿:基于属性值的属性类型

时间:2020-06-17 10:45:20

标签: typescript

是否可以根据属性值设置属性类型?

例如,如果命令为:

  • “设置”有效载荷必须为PayloadSet
  • “投入”有效载荷必须为PayloadPut
  • “ del”有效负载必须为PayloadDel

现在我找到的最接近的解决方案是:

export interface Command {
    command: 'set' | 'put' | 'del';
    payload: PayloadSet | PayloadPut | PayloadDel;
}

但是,这允许用户设置命令并设置错误的有效载荷

2 个答案:

答案 0 :(得分:2)

将其设计为联合体:

type Command =
    | { command: 'set'; payload: PayloadSet; } 
    | { command: 'put'; payload: PayloadPut; } 
    | { command: 'del'; payload: PayloadDel; } 

答案 1 :(得分:0)

您可以通过向Command接口添加泛型来对条件类型做一些花哨的事情:

interface PayloadDel { }
interface PayloadPut {}
interface PayloadSet {}

type Commands = 'set' | 'put' | 'del'
export interface Command<K extends Commands> {
    command: K;
    payload: K extends 'set' ? PayloadSet : K extends 'put' ? PayloadPut : PayloadDel;
}

let command: Command<'set'>

这样,类型取决于K的类型