比方说,我有一个方法将其功能委托给外部库中的某个方法,并且我有一个用于该外部方法的类型,例如LibDoStuffMethodType
。
class MyApp {
doStuff(args) {
// delegate to external library's lib.doStuff
}
}
现在,如何为我的方法MyApp.doStuff()
指定类型?自然,我可以将doStuff()
设为MyApp的属性:
class MyApp {
doStuff: LibDoStuffMethodType
}
但这是不希望有的,原因有多种(其中之一是对IntelliSense的支持,我们宁愿在IntelliSense的建议中看到doStuff()
是实际方法,而不是属性,方法和属性都带有颜色和标记)不同)。
因此,问题是:有没有任何方法可以将该方法保留为方法,但是以某种方式指定其完整类型LibDoStuffMethodType
?
答案 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,但是有很多警告,我不知道它是否适合您。我不知道是否还有其他解决方法,但我怀疑它们都会遇到类似的问题。
那是我能得到的最接近的。希望能帮助到你。祝你好运!