Typescript:如何检查接口类型

6
我有一个名为getUniqueId的方法,接受以下两种类型的接口,根据传入的接口类型,将返回唯一的id:
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;   
}

我在想,在这种情况下设计接口/方法的最佳实践是什么。提前感谢!

2个回答

12
在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支持。

不可能?你是指不可能还是开玩笑的? - jcollum
我是说不可能的。抱歉,我的英语不是很好 :) - undefined
不可能其实是一种玩笑,但它是关于那些不知道正确词语的人的玩笑,所以在你的情况下最好避免使用。 - undefined
https://www.collinsdictionary.com/us/dictionary/english/unpossible -- 显然这是一个词!但是美国人说这个词时通常是在开玩笑,嘲笑糟糕的英语。无论如何,我将其修正为“不可能”。 - undefined
1
谢谢你的帮助,伙计 :) - undefined

-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

这会导致编译错误:'MyInterface'仅用作类型引用,但在此处被用作值。 - TruMan1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接