对于我正在从事的半教育副项目,我有一个 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/