打字稿-instanceof的数组

时间:2019-10-29 13:49:09

标签: typescript inheritance

想知道打字稿是否有任何方法可以通过从基本控件后代派生对象来实现对象的类型

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;
}

任何人都可以重定向吗?

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用

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))

答案 1 :(得分:1)

如果您想对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