Typescript:如何检查接口类型

问题描述 投票:0回答:2

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

所以,我想知道在这种情况下设计接口/方法的最佳实践是什么。预先感谢!

javascript typescript interface
2个回答
9
投票

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支持


-3
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.