Как объявить тип свойства на основе значения какого-либо другого свойства в TypeScript - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть это:

export type FieldType = 'number' | 'boolean' | 'string';

export interface IField {
  key: string;
  value: any;
  type: FieldType;
}

Можно ли заменить values тип any другим определением, чтобы значения, хранящиеся в свойстве value, действительно имели тип, который type поле содержит. Т.е. если объект имеет 'string' значение в свойстве type, значения, которые содержит свойство value, должны иметь тип string (и так же для number и boolean также).

Итак что это работает так:

const booleanTypeError = <IField>{
  key: 'someKey',
  value: 'true', // throw error
  type: 'boolean'
};

const booleanTypeOK = <IField>{
  key: 'someKey',
  value: true, // no error
  type: 'boolean'
};

const stringTypeOK = <IField>{
  key: 'someKey',
  value: 'true', // no error
  type: 'string'
};

const stringTypeError = <IField>{
  key: 'someKey',
  value: true, // throw error
  type: 'string'
};

Я пытался использовать keyof и typeof, но не повезло, поскольку я все время получал ошибки. Я использую TypeScript 3.7.5 (но я также могу использовать 3.8).

1 Ответ

2 голосов
/ 30 апреля 2020

Вы можете использовать различимые союзы

type FieldType = 'number' | 'boolean' | 'string'

type IField = {
    key: string;
} & {
    value: number
    type: 'number'
} | {
    value: boolean
    type: 'boolean'
} | {
    value: string
    type: 'string'
}

С интерфейсами

interface Base {
  key: string
}

interface Bool extends Base {
  value: boolean
  type: 'boolean'
}

interface Num extends Base {
  value: number
  type: 'number'
}

interface Str extends Base {
  value: string
  type: 'string'
}

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