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

时间:2018-07-06 09:35:25

标签: typescript types

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

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

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

class MyApp {
  doStuff: LibDoStuffMethodType
}

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

因此,问题是:有没有任何方法可以将该方法保留为方法,但是以某种方式指定其完整类型LibDoStuffMethodType

1 个答案:

答案 0 :(得分:1)

有一个现有的suggestion,允许使用函数/可调用类型别名或接口来键入函数语句(可能是方法定义)。看起来好像没有很多吸引力,但是如果您认为自己有很强的用例,则可能要去那里并给它一个或评论。


在没有该功能的情况下,如果要像这样创建类需要实现的接口,该怎么办?

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中自动推断出这些,但不幸的是,this is not currently possible可以推断出这些。这意味着我希望对您的问题的任何直接解决方案都需要一些重复。

有没有解决的办法?好吧,如果LibDoStuffMethodType是单个(没有重载)具体(没有泛型)函数类型,并且如果您可以等到this month, July 2018到TypeScript 3.0(或者可以使用typescript@next),那么您可以将可以像这样利用tuples in rest/spread positions的优势:

// turn a function's parameters into a tuple, might be in standard library
type Parameters<T extends Function> = T extends (...args: infer U) => any ? U : any[];

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

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

那是我能得到的最接近的。希望能帮助到你。祝你好运!