使用 Typescript 的条件输入

Conditional Typing with Typescript

我有两个 classes 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) {
   // ...
}

如何根据正在使用的 class 实例键入 object 以访问函数 functionAfunctionB?下面的代码将不起作用:

function sayHello(object: IClassA | IClassB) 

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

Union Types

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

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

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

示例 (playground):

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