Для полуобразовательного побочного проекта, над которым я работаю, у меня есть 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 выдает пару ошибок, одна из которых:
Cannot find name 'prototype'
Я нахожу это сомнительным, учитывая, что Array<T>
s является «примитивом» JavaScript, и учитывая, что в JavaScript все равно object
(таким образом, некоторые из проблем, которые 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, прежде чем опубликовать этот вопрос.Одним из таких ответов было изменение интерфейса типа хоста с помощью нового метода, что в данном случае я не хочу делать.Я хочу добавить расширение только для случаев, когда мы имеем дело с Array<IIdable>
, а не с другими.
Таким образом, я должен спросить: Каким образом я могу написать метод расширения для универсального типа, для определенного типа вещей, в TypeScript?