typescript-instanceof的数组
我想知道typescript是否可以通过从基本控件子体派生来实现对象的类型typescript-instanceof的数组,typescript,inheritance,Typescript,Inheritance,我想知道typescript是否可以通过从基本控件子体派生来实现对象的类型 interface Config { name: string; } interface Input extends Config { placeholder?: string; } interface Select extends Config { options: Array<Option>; } const fields: Array<Config> = [ { nam
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'
]
接口配置{
名称:字符串;
}
接口输入扩展配置{
占位符?:字符串;
}
界面选择扩展配置{
选项:阵列;
}
常量字段:数组=[
{name:'a',占位符:'a'},//占位符在类型'config'中不存在
{name:'b',options:[]}//类型'config'中不存在选项
]
也尝试过类似的事情
interface Config<T> {
name: string;
fieldType: T
}
interface Input extends Config<'input'> {
placeholder?: string;
}
接口配置{
名称:字符串;
字段类型:T
}
接口输入扩展配置{
占位符?:字符串;
}
有人可以重定向吗?实现重定向的最简单方法是使用
const fields: Array<Select | Input> = [
{ name: 'a', placeholder: 'a'},
{ name: 'b', options: []}
]
实现这一点的最简单方法是使用
const fields: Array<Select | Input> = [
{ name: 'a', placeholder: 'a'},
{ name: 'b', options: []}
]
如果您想对
字段中的所有单个元素强制执行强类型,同时保持其数组
类型,那么这将是类型断言的好地方
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
]
const字段:数组=[
{name:'a',占位符:'a'}作为输入,
{name:'b',选项:[]}作为选择,
{name:'a',占位符:42}作为输入,//错误:占位符有编号
{options:[]}作为选择//错误:缺少名称
]
如果希望对字段中的所有单个元素强制执行强类型,同时保持其数组的类型,那么这将是进行类型断言的好地方
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
]
const字段:数组=[
{name:'a',占位符:'a'}作为输入,
{name:'b',选项:[]}作为选择,
{name:'a',占位符:42}作为输入,//错误:占位符有编号
{options:[]}作为选择//错误:缺少名称
]
在几十个后代的情况下试图避免这种情况。。。必须声明一个类型configdownats=Input | Select | TextArea |任何其他扩展的
希望暴露于某种内置注释,如部分
。。可能是
的实例,但谢谢。。《希望的破灭》让我在向Config
添加fieldType:FIELD\u TYPES
的同时做了这件事,并在每个子体中指定了fieldType
:Input{fieldType:FIELD\u TYPES.Input,placeholder?:string};因此,typescript现在根据
fieldType`公开了正确的允许字段,并试图在几十个子体的情况下避免这种情况。。。必须声明一个类型configdownats=Input | Select | TextArea |任何其他扩展的
希望暴露于某种内置注释,如部分
。。可能是
的实例,但谢谢。。《希望的破灭》让我在向Config
添加fieldType:FIELD\u TYPES
的同时做了这件事,并在每个子体中指定了fieldType
:Input{fieldType:FIELD\u TYPES.Input,placeholder?:string};因此,typescript现在根据
fieldType`显示您的用例吗?为什么您需要注释字段
?您可以编写const fields=[{name:'a',占位符:'a'},{name:'b',options:[]}]
并获取一个对象,该对象将被任何需要类型Array
的值的对象所接受。您是否需要保证字段的每个元素符合您声明的配置扩展名之一?如果是这样的话,您需要在代码中的某个地方使用这些类型的联合,这就是建议,但您说您希望避免这种情况。您能展示一下您的用例吗?为什么您需要注释字段
?您可以编写const fields=[{name:'a',占位符:'a'},{name:'b',options:[]}]
并获取一个对象,该对象将被任何需要类型Array
的值的对象所接受。您是否需要保证字段的每个元素符合您声明的配置扩展名之一?如果是这样的话,您需要在代码中的某个地方使用这些类型的联合,这就是建议,但您说希望避免这种情况。类型断言将允许{name:'a'}作为输入
,但这可能并不理想。我想就是这样。。。正如@thomashiebaud所建议的那样,很明显,我不能要求typescript在没有明确声明的情况下找到匹配的后代。否则它会扫描整个宇宙。也许有一天会成为一个特色。之所以接受此选项,是因为它还允许动态集成,而无需强键入所有当前可用的类型。hm不确定,您的确切意思是什么,因为占位符
是输入
的可选属性。因此,我将考虑<代码> {名称:“a”} /代码>,作为赋值给<代码>输入< /代码>。类型断言允许<代码> {No:A`}作为输入< /代码>,但是,这可能不太理想。正如@thomashiebaud所建议的那样,很明显,我不能要求typescript在没有明确声明的情况下找到匹配的后代。否则它会扫描整个宇宙。也许有一天会成为一个特色。之所以接受此选项,是因为它还允许动态集成,而无需强键入所有当前可用的类型。hm不确定,您的确切意思是什么,因为占位符
是输入
的可选属性。因此,我将考虑<代码> {Ne:A`}} /Case>,作为赋值给<代码>输入< /代码>。