如何将对象投射到它';typescript中的s派生接口

如何将对象投射到它';typescript中的s派生接口,typescript,Typescript,我正在尝试将对象(项接口)强制转换为其派生接口(FileItem或FolderItem) 接口项{ id:编号; 名称:字符串; } 接口FileItem扩展项{ 大小:数量; } 接口FolderItem扩展项{ 父id:编号; } 常量文件:FileItem[]=[{id:1,名称:'filename 1',大小:1024}]; const folders:FolderItem[]=[{id:1,名称:'folder 1',parent_id:0}]; 常量项=新数组(…文件,…文件夹);

我正在尝试将对象(项接口)强制转换为其派生接口(FileItem或FolderItem)

接口项{
id:编号;
名称:字符串;
}
接口FileItem扩展项{
大小:数量;
}
接口FolderItem扩展项{
父id:编号;
}
常量文件:FileItem[]=[{id:1,名称:'filename 1',大小:1024}];
const folders:FolderItem[]=[{id:1,名称:'folder 1',parent_id:0}];
常量项=新数组(…文件,…文件夹);
items.forEach(i=>{
const isFile=i作为文件项;
if(isFile){
writeLog(“它是一个文件”);
}
else writeLog(“它是一个文件夹”);
})
在foreach循环中,typescript将所有项强制转换为FileItem,这是错误的,因为它应该强制转换为FileItem和FolderItem,请查看
这就是typescript中的类型转换工作方式吗?如何转换到正确的界面。

谢谢

这不是Typescript中的打字方式。在编译过程中,所有类型都被剥离,因此您的代码将以如下方式结束:

items.forEach(i => {
  if (isFile(i)) {
    writeLog('its a file');
  }
  else writeLog('its a folder');
})
constfiles=[{id:1,name:'filename 1',size:1024}];
const folders=[{id:1,name:'folder 1',parent_id:0}];
常量项=新数组(…文件,…文件夹);
items.forEach(i=>{
常数isFile=i;
if(isFile){
writeLog(“它是一个文件”);
}
else writeLog(“它是一个文件夹”);
})
isFile
将始终是真实的,因为
i
是真实的

要得到你想要的东西,你需要使用。例如:

function isFile(item: Item): item is FileItem {
  return (item as FileItem).size !== undefined;
}
这将检查
是否具有属性
大小
。如果是,则必须是
文件项
。您可以这样使用它:

items.forEach(i => {
  if (isFile(i)) {
    writeLog('its a file');
  }
  else writeLog('its a folder');
})
完整代码:

interface Item {
  id: number;
  name: string;
}

interface FileItem extends Item {
  size: number;
}

interface FolderItem extends Item {
  parent_id: number;
}

function isFile(item: Item): item is FileItem {
  return (item as FileItem).size !== undefined;
}

const files: FileItem[] = [ {id: 1, name: 'file name 1', size: 1024 } ];
const folders: FolderItem[] = [ {id:1, name: 'folder 1', parent_id: 0} ];
const items = new Array<Item>(...files, ...folders);
items.forEach(i => {
  if (isFile(i)) {
   writeLog('its a file');
 }
 else writeLog('its a folder');
})

谢谢,我可以问一下使用新数组而不是[…]有什么问题吗?@ArhHokagi和(在我看来)更清楚。它还有助于避免错误,因为如果使用单个数字调用
newarray
(例如
newarray(2)
),它只会创建长度为
2的空数组。
const items: Item[] = [...files, ...folders]