typescript - 如何在 TypeScript 中为特定类型的泛型类型创建扩展方法

标签 typescript generics extension-methods

对于我正在从事的半教育副项目,我有一个 TypeScript interface暴露了 id任何实现它的对象上的变量。在这个应用程序中,Array<> 是相当常见的。这些IIdable对象。

由于此应用程序不使用数据库,我正在尝试做的事情是为跟踪这些 IIdable 列表的服务实现一个自动增量器。 s。自然,我考虑以“JavaScript”方式添加扩展,如下所示...

Array<MyProject.Models.IIdable>.prototype.getNextId = () => {
    let biggestId: number = 0;
    for (let current of this) {
        if (current.id > biggestId)
            biggestId = current.id;
    }

    return biggestId + 1;
};

...但是 Visual Studio Code 引发了几个错误,其中一个是:
Cannot find name 'prototype'

我觉得这有问题,因为 Array<T> s 是 JavaScript 的“原始”,并且假设一切都是 object在 JavaScript 中(因此创建 TypeScript 是为了减少或完全避免一些问题。)但是,我意识到我对 JavaScript 和 TypeScript 的了解都足够“危险”,这意味着我知道足够多的事情来允许自己做一些事情哑的。

如果我使用的是 C#——TypeScript 不是——我会编写这样的扩展方法:
public static GetNextId(this List<IIdable> source)
{
    // ...Read each IIdable's ID to figure out the next biggest to give.
}

...不幸的是,据我所知,我无法做到这一点。在发布这个问题之前,我对在 TypeScript 中编写扩展方法进行了一些研究。一个这样的答案是用新方法修改主机类型的接口(interface),在这种情况下我不想这样做。我只想为处理 Array<IIdable> 的情况添加扩展。 ,而没有其他人。

因此,我必须问:我可以通过什么方式在 TypeScript 中为特定类型的事物编写泛型类型的扩展方法?

最佳答案

泛型类 Array只有一个原型(prototype);访问原型(prototype)时不能指定类型参数。但是,您可以覆盖 this在方法上键入。以下是您如何声明然后定义该方法。请注意,您必须使用 function函数,它能够接收 this参数,而不是箭头函数,它总是使用 this这在定义它的范围内(在这种情况下是全局对象)。

interface Array<T> { 
  getNextId(this: MyProject.Models.IIdable[]): number;
}

// The `this` type for the function is taken from the declaration above.
Array.prototype.getNextId = function() {
    let biggestId: number = 0;
    for (let current of this) {
        if (current.id > biggestId)
            biggestId = current.id;
    }

    return biggestId + 1;
};

关于typescript - 如何在 TypeScript 中为特定类型的泛型类型创建扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52844124/

相关文章:

angular - Ionic2/Cordova typescript 项目中的 Moment.js 插件

node.js - 使用 TypeScript 导入 Node 模块

typescript - ES6 与 TypeScript 中的泛型类型混合

java - Map.get(Object key) 不是(完全)通用的原因是什么

asp.net-mvc-3 - 滚动我自己的@Html.BeginfOrm()

typescript - 如何在 onCreate 中创建自定义声明?

swift - 从 rawValue 初始化泛型类型的枚举

java - ArrayList 和 Arrays.asList 在继承情况下对 Collection 的工作方式不同

c# - Enum 的 Count 和 ToList 扩展方法?

.NET 扩展事件