【问题标题】:How to write a Kotlinesque extension function in Typescript?如何在 Typescript 中编写 Kotlinesque 扩展函数?
【发布时间】:2021-05-13 12:26:48
【问题描述】:

如果我有这样的 interface,我 Kotlin

interface User {
    val name: String
    val email: String
}

我可以在代码的任何地方写这样的扩展函数:

fun User.toUserDto(): UserDto {
    TODO()
}

如果我有类似的interface,在 Typescript 中:

export default interface User {
    name: string;
    email: string;
}

如何以类似的方式对其进行扩充?这是该语言的最佳实践吗?有没有我不知道的替代方法?

【问题讨论】:

  • 这在 TypeScript 中是不可能的,它不会根据类型信息改变其发射。
  • 稍微改进了我的回答,希望对您有所帮助

标签: javascript typescript kotlin extension-methods extension-function


【解决方案1】:

Typescript 中的Interfaces 只能描述数据的形状,不能创建它们的实例或改变它们。

要编写接口的扩展函数,你需要在一个类中实现接口,并在类中添加你需要的任何东西。

export class SomeUserClass implements User {
  name: string;
  email: string;
  
  constructor(name, email) {
    ...
  }

  toUserDto() {
    ...
  }
}

【讨论】:

  • 这不是我的问题的答案。扩展函数很强大,因为使用它们我可以扩充类/接口我无法控制(就像依赖项中的类)。这是我的用例。
  • 我投了反对票,因为答案包含Interfaces in Typescript are meant to describe the shape of data, they cannot include functions; 修复该行
  • 不,不是。请阅读typescriptlang.org/docs/handbook/interfaces.html 并查看“您还可以在类中实现的接口中描述方法”
  • 但确实如此。为什么你认为他们不是?
  • 你不能调用Foo.update(),因为Foo不是一个值;您可以在 foo 类型为 Foo 的任何 foo.update() 上调用 foo.update()
【解决方案2】:

您可以增加classes like this,但这取决于prototype 属性,并且没有User.prototype(也根本没有User 值)。

你也可以看到这个very long discussion。拒绝 Kotlin/C# 方法的原因是 here

【讨论】:

  • 当我想以 Typescript 方式扩充我无法控制的类时,最佳做法是什么?
  • 对于类,请参阅第一个链接或此处的另一个示例 stackoverflow.com/posts/38434418,但它不像在 Kotlin 中那样普遍。我在 TypeScript 方面没有足够的经验来判断最佳实践,但似乎没问题。
  • 对您的用例可能或可能无关紧要的一个区别是实际上将扩充添加到原型对象中,例如Javascript 客户端会看到它们,并且同一个类(或子类)上的两个同名“扩展函数”会中断。
猜你喜欢
  • 1970-01-01
  • 2017-04-18
  • 2019-10-18
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多