машинопись - массив instanceof - PullRequest
       4

машинопись - массив instanceof

0 голосов
/ 29 октября 2019

задавался вопросом, есть ли способ для машинописи реализовать тип объекта, извлекая его из базовых потомков управления

interface Config {
  name: string;
}

interface Input extends Config {
  placeholder?: string;
}

interface Select extends Config {
  options: Array<Option>;
}

const fields: Array<Config> = [
  { name: 'a', placeholder: 'a'}, // placeholder does not exist in type 'config'
  { name: 'b', options: []} // options does not exist in type 'config'
]

также пытался сделать что-то вроде

interface Config<T> {
  name: string;
  fieldType: T
}

interface Input extends Config<'input'> {
  placeholder?: string;
}

canкто-нибудь перенаправил?

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Если вы хотите применить строгую типизацию для всех отдельных элементов в fields, сохраняя при этом тип Array<Config>, это было бы хорошим местом для утверждений типа.

const fields: Array<Config> = [
  { name: 'a', placeholder: 'a'} as Input, 
  { name: 'b', options: [] } as Select,
  { name: 'a', placeholder: 42} as Input,  // error: placeholder has number
   {options: []} as Select // error: name is missing
]

Playground

1 голос
/ 29 октября 2019

Самый простой способ добиться этого - использовать

const fields: Array<Select | Input> = [
  { name: 'a', placeholder: 'a'},
  { name: 'b', options: []}
]

. Позволяет корректно использовать родительский тип Config, как позже

function displayName(config: Config) {
  console.log(config.name)
}

fields.forEach(config => displayName(config))
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...