如果您有两个足够相似的接口(interface),您希望通过相同的逻辑来运行它们,那么处理这种情况的正确方法是什么:
interface DescriptionItem {
Description: string;
Code: string;
}
interface NamedItem {
Name: string;
Code: string;
}
function MyLogic(i: DescriptionItem | NamedItem) {
var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name;
return i.Code + ' - ' + desc;
}
这行得通;但是,我的问题是关于改进 var desc = ...
行。我所拥有的是最好的选择吗?或者在 Typescript 中有更好的方法来处理这种情况吗?
最佳答案
TypeScript interfaces
仅在编译时存在,因此您无法在运行时测试接口(interface)类型。您在问题中指定的代码很有意义,可能是您的最佳选择。
但是,如果您可以灵活地将 interfaces
更改为 classes
,则可以使用 TypeScript 的类型保护来进行更优雅的类型检查:
class DescriptionItem {
Description: string;
Code: string;
}
class NamedItem {
Name: string;
Code: string;
}
function MyLogic(i: DescriptionItem | NamedItem) {
let desc: string;
if (i instanceof DescriptionItem) {
desc = i.Description;
} else {
desc = i.Name;
}
return i.Code + ' - ' + desc;
}
关于Typescript 联合类型 : Dealing with Interfaces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726858/