【问题标题】:Conditional Typing with Typescript使用 Typescript 进行条件输入
【发布时间】:2020-11-21 18:02:21
【问题描述】:

我有两个类 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 类型。谢谢。

【问题讨论】:

    标签: javascript typescript3.0


    【解决方案1】:

    Union Types

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

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

    【讨论】:

    • 我收到Property 'functionA' does not exist on type 'ClassA | ClassB'. Property 'functionA' does not exist on type 'ClassB'
    • @lomse 我也更新了我的答案。请看一看。
    • 是的,这看起来很棒。谢谢
    【解决方案2】:

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

    示例 (playground):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 2012-11-08
      • 2017-10-05
      • 2014-03-02
      • 2013-05-14
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多