指定方法的类型,而不将该方法转换为属性 [英] Specify method's type without converting the method to property

查看:10
本文介绍了指定方法的类型,而不将该方法转换为属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个方法将其功能委托给外部库中的某个方法,并且我有该外部方法的类型,例如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自动推断出这些,那就太好了,但遗憾的是,这目前还不可能(see microsoft/TypeScript#1373)。这意味着我希望您的问题的任何直接解决方案都需要一些重复。

有没有办法绕过这一点?如果LibDoStuffMethodType是单个(无重载)特定(非泛型)函数类型,则可以使用the Parameters<T>the `ReturnType utility types以编程方式注释参数列表并返回类型:

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

那是烘干机,但有太多的注意事项,我不知道它是否适合你。我不知道是否有其他解决方法,但我怀疑它们都会有类似的问题。

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

这篇关于指定方法的类型,而不将该方法转换为属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆