typescript - 指定方法的类型而不将方法转换为属性
问题描述
假设,我有一个方法将其功能委托给外部库中的某个方法,并且我有该外部方法的类型,例如LibDoStuffMethodType
.
class MyApp {
doStuff(args) {
// delegate to external library's lib.doStuff
}
}
现在,如何为我的方法指定类型MyApp.doStuff()
?自然,我可以将doStuff()
MyApp 的属性设为:
class MyApp {
doStuff: LibDoStuffMethodType
}
但这出于多种原因是不可取的(其中一个是 IntelliSense 支持,我们宁愿在 IntelliSense 建议中看到它doStuff()
是一种实际方法,而不是属性,方法和属性的颜色和标记不同)。
所以,问题是:有没有办法将方法保持为方法,但以某种方式指定其完整类型LibDoStuffMethodType
?
解决方案
在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,但有很多警告,我不知道它是否适合你。我不知道是否有其他解决方法,但我怀疑它们都会有类似的问题。
这是我能得到的最接近的。
推荐阅读
- javascript - 找出哪两种颜色混合形成第三种颜色的算法(在 JavaScript 中)
- ruby-on-rails - 如何找到在 Rails 中调用的“未初始化常量”在哪里?
- terraform - terraform中基于条件创建嵌套资源参数块
- mysql - 将 MySQL 连接到 Spring Boot:通信失败
- angular - 角度材料自动完成可防止 setValue 的反应性工作
- python - 为并行处理定义组件的正确方法
- javascript - 动态附加内容(包括内联 javascript 和样式)时出现问题
- python - 使用 Python 中的字典查找给定范围内的友好数字
- php - 如何在mysql,php中访问每个类别中相同数量的行
- c# - 从 ManagementObjectSercher 和 ManagementObject 获取附加值