如何将对象投射到它';typescript中的s派生接口
我正在尝试将对象(项接口)强制转换为其派生接口(FileItem或FolderItem)如何将对象投射到它';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}]; 常量项=新数组(…文件,…文件夹);
接口项{
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]