Машинопись: тип свойства на основе значения свойства - PullRequest
1 голос
/ 17 июня 2020

Возможно ли установить тип свойства на основе значения свойства?

Пример, если команда:

  • полезная нагрузка 'set' должна быть PayloadSet
  • ' put 'payload must be PayloadPut
  • ' del 'payload должно быть PayloadDel

Теперь ближайшее найденное мной решение:

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

, но это позволяет пользователю установить команду и установить неправильную полезную нагрузку

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

Оформите его как объединение:

type Command =
    | { command: 'set'; payload: PayloadSet; } 
    | { command: 'put'; payload: PayloadPut; } 
    | { command: 'del'; payload: PayloadDel; } 
0 голосов
/ 17 июня 2020

Вы можете делать какие-то причудливые вещи с условными типами, добавляя generi c в командный интерфейс:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...