Как создать метод расширения для определенного типа универсального типа в TypeScript - PullRequest
0 голосов
/ 17 октября 2018

Для полуобразовательного побочного проекта, над которым я работаю, у меня есть 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?

1 Ответ

0 голосов
/ 17 октября 2018

Универсальный класс Array имеет только один прототип;Вы не можете указать аргумент типа при доступе к прототипу.Однако вы можете переопределить тип 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...