首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >typescript - instanceof数组

typescript - instanceof数组
EN

Stack Overflow用户
提问于 2019-10-29 21:49:09
回答 2查看 92关注 0票数 0

我想知道typescript是否有办法通过从基本控件的后代派生对象来实现对象的类型

代码语言:javascript
复制
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'
]

我还尝试了像这样的东西

代码语言:javascript
复制
interface Config<T> {
  name: string;
  fieldType: T
}

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

任何人都可以重定向吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-29 22:24:27

如果您想在保留其Array<Config>类型的同时,对fields中的所有单个元素强制执行强类型,这将是进行类型断言的好地方。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-10-29 22:06:41

要实现这一点,最简单的方法是使用

代码语言:javascript
复制
const fields: Array<Select | Input> = [
  { name: 'a', placeholder: 'a'},
  { name: 'b', options: []}
]

它允许您稍后像那样正确使用父类型Config

代码语言:javascript
复制
function displayName(config: Config) {
  console.log(config.name)
}

fields.forEach(config => displayName(config))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58608747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档