在列表中,可以根据Typescript?中的对象属性获取对象的对象类型?
我有一个不同对象的列表在列表中,可以根据Typescript?中的对象属性获取对象的对象类型?,typescript,Typescript,我有一个不同对象的列表 const列表:MyListItem[]=[ { 尺码:100, 名称:'标签', 键入:“文本” }, { 尺码:100, 名称:“label2”, 键入:“textarea” }, { 尺码:100, 名称:“label3”, 键入:“复选框”, 标签:“复选框标签” } ] 接口MyListItem{ 尺寸:数量, 名称:string, 键入:“文本”|“文本区域”|“
const列表:MyListItem[]=[
{
尺码:100,
名称:'标签',
键入:“文本”
},
{
尺码:100,
名称:“label2”,
键入:“textarea”
},
{
尺码:100,
名称:“label3”,
键入:“复选框”,
标签:“复选框标签”
}
]
接口MyListItem{
尺寸:数量,
名称:string,
键入:“文本”|“文本区域”|“复选框”
}
接口MyListItemCheckbox{
尺寸:数量,
名称:string,
键入:“文本”|“文本区域”|“复选框”,
标签:字符串
}
是否可以基于类型项获取内部对象接口
当类型为checkbox
时,我希望获得MyListItemCheckbox
otherwiseMyListItem
(我的真实案例有点复杂,上面的例子是为了简化解释)
你需要使用所谓的a。基本上,
列表
应该分配给两个接口的联合类型:一个包含标签
属性,另一个不包含
下面是一个例子(也是):
const列表:MyListItem[]=[
{
尺码:100,
名称:'标签',
键入:“文本”
},
{
尺码:100,
名称:“label2”,
键入:“textarea”
},
{
尺码:100,
名称:“label3”,
键入:“复选框”,
标签:“复选框标签”
}
]
接口BaseListItem{
大小:数量;
名称:字符串;
类型:字符串;
}
接口TextLikeListItem扩展BaseListItem{
键入:“text”|“textarea”;
}
接口CheckboxListItem扩展了BaseListItem{
键入:“复选框”;
标签:字符串;
}
键入MyListItem=TextLikeListItem | CheckboxListItem;
对于(列表中的项目){
如果(item.type=='text'| | item.type==='textarea'){
console.log(item);//`item`被推断为TextLikeListItem
console.log(item.label);//错误
}else if(item.type===“复选框”){
console.log(item);//`item`被推断为CheckboxListItem
console.log(item.label);//确定
}
}
您需要使用所谓的。基本上,列表
应该分配给两个接口的联合类型:一个包含标签
属性,另一个不包含
下面是一个例子(也是):
const列表:MyListItem[]=[
{
尺码:100,
名称:'标签',
键入:“文本”
},
{
尺码:100,
名称:“label2”,
键入:“textarea”
},
{
尺码:100,
名称:“label3”,
键入:“复选框”,
标签:“复选框标签”
}
]
接口BaseListItem{
大小:数量;
名称:字符串;
类型:字符串;
}
接口TextLikeListItem扩展BaseListItem{
键入:“text”|“textarea”;
}
接口CheckboxListItem扩展了BaseListItem{
键入:“复选框”;
标签:字符串;
}
键入MyListItem=TextLikeListItem | CheckboxListItem;
对于(列表中的项目){
如果(item.type=='text'| | item.type==='textarea'){
console.log(item);//`item`被推断为TextLikeListItem
console.log(item.label);//错误
}else if(item.type===“复选框”){
console.log(item);//`item`被推断为CheckboxListItem
console.log(item.label);//确定
}
}
实现所需功能的一种方法是扩展接口。例如:
interface MyListItem {
size: number;
name: string;
}
interface MyTextListItem extends MyListItem {
type: 'text' | 'textarea';
placeholder: string;
}
interface MyCheckboxListItem extends MyListItem {
type: 'checkbox';
checked: boolean;
}
type Item = MyTextListItem | MyCheckboxListItem;
const text: Item = {
size: 2,
name: '',
type: 'text',
placeholder: 'a'
}
const checkbox: Item = {
size: 2,
name: '',
type: 'checkbox',
checked: true
}
这就是你想要的吗?现在打字正确了。在这里,您可以在中看到它。实现所需功能的一种方法是扩展您的界面。例如:
interface MyListItem {
size: number;
name: string;
}
interface MyTextListItem extends MyListItem {
type: 'text' | 'textarea';
placeholder: string;
}
interface MyCheckboxListItem extends MyListItem {
type: 'checkbox';
checked: boolean;
}
type Item = MyTextListItem | MyCheckboxListItem;
const text: Item = {
size: 2,
name: '',
type: 'text',
placeholder: 'a'
}
const checkbox: Item = {
size: 2,
name: '',
type: 'checkbox',
checked: true
}
这就是你想要的吗?现在打字正确了。在这里你可以在中看到它,我想你必须使用一个
(MyListItem | MyListItemCheckbox)[
为列表键入,然后使用类型缩小来获得具体的内容,如果(“项目中的标签){/*项目是MyListItemCheckbox*/}/*项目是MyListItem*/
我想你必须使用(MyListItem | MyListItemCheckbox)[]
键入列表,然后使用类型缩小来获取具体内容if(项中的“标签”){/*项是MyListItemCheckbox*/}/*项是MyListItem*/
还可以添加类型保护
来确定列表项的类型
会更好。还可以添加类型保护
来确定列表项的类型
会更好。