使用打字稿进行条件打字

时间:2020-07-31 21:45:42

标签: javascript typescript3.0

我有两个类ClassAClassB如下:

interface IClassA {
   functionA: ()=> void
}

class ClassA implements IClassA{
  functionA(){
    console.log('hello world A')
  }
}


interface IClassB {
   functionB: ()=> void
} 

class ClassB implements IClassB{
  functionB() {
    console.log('hello world B')
  }
}

我还有另一个函数需要使用ClassAClassB的实例作为参数,如下所示。

function sayHello(object) {
   // ...
}

如何根据所使用类的实例键入object来访问函数functionAfunctionB?以下代码无效:

function sayHello(object: IClassA | IClassB) 

我不想使用泛型any类型。谢谢。

enter image description here

2 个答案:

答案 0 :(得分:1)

Union Types

您实际上可以使用|运算符来创建联合类型。如果您的类具有单独的逻辑,则可以在运行类特定的代码之前使用instanceOf语法检查类。

function sayHello(input: ClassA | ClassB) : string {
  if (input instanceof ClassA) {
    input.A();
  }
}

答案 1 :(得分:1)

您可以在尝试调用对象之前检查其functionA

示例(playground):

function sayHello(obj: IClassA | IClassB) {
  if ('functionA' in obj) {
    obj.functionA()
  }
}