Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在列表中,可以根据Typescript?中的对象属性获取对象的对象类型?_Typescript - Fatal编程技术网

在列表中,可以根据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
otherwise
MyListItem

(我的真实案例有点复杂,上面的例子是为了简化解释)


你需要使用所谓的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*/
还可以添加
类型保护
来确定
列表项的类型
会更好。还可以添加
类型保护
来确定
列表项的类型
会更好。