我想知道typescript是否有办法通过从基本控件的后代派生对象来实现对象的类型
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;
}任何人都可以重定向吗?
发布于 2019-10-29 22:24:27
如果您想在保留其Array<Config>类型的同时,对fields中的所有单个元素强制执行强类型,这将是进行类型断言的好地方。
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
]发布于 2019-10-29 22:06:41
要实现这一点,最简单的方法是使用
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))https://stackoverflow.com/questions/58608747
复制相似问题