繁体   English   中英

Typescript:如何查看接口类型

[英]Typescript: How to check interface type

我有一个 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 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM