首页 > 解决方案 > 指定方法的类型而不将方法转换为属性

问题描述

假设,我有一个方法将其功能委托给外部库中的某个方法,并且我有该外部方法的类型,例如LibDoStuffMethodType.

class MyApp {
  doStuff(args) {
     // delegate to external library's lib.doStuff
  }
}

现在,如何为我的方法指定类型MyApp.doStuff()?自然,我可以将doStuff()MyApp 的属性设为:

class MyApp {
  doStuff: LibDoStuffMethodType
}

但这出于多种原因是不可取的(其中一个是 IntelliSense 支持,我们宁愿在 IntelliSense 建议中看到它doStuff()是一种实际方法,而不是属性,方法和属性的颜色和标记不同)。

所以,问题是:有没有办法将方法保持为方法,但以某种方式指定其完整类型LibDoStuffMethodType

标签: typescripttypes

解决方案


在microsoft/TypeScript#22063中有一个现有的建议,允许使用函数/可调用类型别名或接口来键入函数语句(可能还有方法定义)。看起来那里没有太大的吸引力,但如果你认为你有一个强大的用例,你可能想去那里给它一个或评论。


在没有该功能的情况下,如果您要创建一个类需要实现的接口,像这样呢?

type LibDoStuffMethodType = (x: string, y: number) => boolean
interface DoStuffMethod { doStuff: LibDoStuffMethodType };

class MyApp implements DoStuffMethod {
  doStuff(a: string, b: number) {
    return true;
    // delegate to external library's lib.doStuff
  }
}
declare const myApp: MyApp;
myApp.doStuff; // looks like a method now

该类MyApp现在有一个名为的真正方法doStuff,但它被限制为类型LibDoStuffMethodType


就目前而言,这是可行的,但我怀疑您会因为需要强输入方法的参数和返回类型而感到不高兴。如果这些可以从界面自动推断出来,那就太好了DoStuffMethod,但不幸的是,目前还不可能(参见 microsoft/TypeScript#1373)。这意味着我希望任何直接解决您的问题的方法都需要一些重复。

有没有办法解决这个问题?好吧,如果LibDoStuffMethodType是单个(无重载)特定(无泛型)函数类型,您可以使用和` Parameters<T>ReturnType 实用程序类型以编程方式注释参数列表和返回类型:

class MyApp implements DoStuffMethod {
  doStuff(...args: Parameters<LibDoStuffMethodType>): ReturnType<LibDpStuffMethodType> {
    return true;
    // delegate to external library's lib.doStuff
  }
}

那是 DRYer,但有很多警告,我不知道它是否适合你。我不知道是否有其他解决方法,但我怀疑它们都会有类似的问题。

这是我能得到的最接近的。


推荐阅读