我有一个 getUniqueId 方法,它接受下面两种接口,它将根据传递的接口类型返回 uniqueId:
interface ReadOnlyInfo {
itemId: string;
....
}
interface EditInfo {
formId: number;
....
}
function getUniqueId (info: ReadOnlyInfo | EditInfo) {
if (info instanceof ReadOnlyInfo) {
return info.itemId;
}
return info.formId;
}
我想知道在这里使用 instanceof 是否是一个好习惯。我担心的是,我可能有许多其他类似于 getUniqueId 的方法,它们也接受“ReadOnlyInfo | EditInfo”类型,所以我必须在各处重复“ReadOnlyInfo | EditInfo”。
我没有这样做,而是尝试使用 type:
type CommonInfo = | ReadOnlyInfo | EditInfo;
这样,我可以保存一些代码(只需执行 CommondInfo),如下所示,但是这样,我无法判断 CommonInfo 是什么类型,instanceof 不再起作用并给我编译器错误。
function getUniqueId (info: CommonInfo) {
if (info instanceof ReadOnlyInfo) {
return info.itemId;
}
return info.formId;
}
所以,我想知道在这种情况下设计接口/方法的最佳实践是什么。预先感谢!
Typescript 中的接口只是您 IDE 的语法糖。无法像其他语言那样检查接口类型。以 C# 为例。
但是通过类型保护,您可以识别正在使用哪个接口。
interface ReadOnlyInfo {
itemId: string;
....
}
interface EditInfo {
formId: number;
....
}
function getUniqueId (info: ReadOnlyInfo | EditInfo) {
if (isReadOnlyInfo(info)) return info.itemId;
if (isEditInfo(info)) return info.formId;
}
function isReadOnlyInfo(item: any): item is ReadOnlyInfo {
return 'itemId' in item;
}
function isEditInfo(item: any): item is EditInfo {
return 'formId' in item;
}
通过这种方式你可以获得更好的IDE支持
In TypeScript, you can use the getPrototypeOf operator to check the type of an interface object. For example:
interface MyInterface {
prop1: string;
prop2: number;
}
const myObject: MyInterface = { prop1: 'hello', prop2: 42 };
console.log(myObject && (Object.getPrototypeOf(myObject) === MyInterface.prototype))
// true