指定方法的类型而不将方法转换为属性

Vla*_*kov 5 types typescript

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

class MyApp {
  doStuff(args) {
     // delegate to external library's lib.doStuff
  }
}
Run Code Online (Sandbox Code Playgroud)

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

class MyApp {
  doStuff: LibDoStuffMethodType
}
Run Code Online (Sandbox Code Playgroud)

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

所以,问题是:有什么方法可以将方法保留为方法,但以某种方式指定其完整类型LibDoStuffMethodType

jca*_*alz 6

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
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

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

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