Как написать метод расширения примитивного типа TypeScript, который проверяется типом - PullRequest
0 голосов
/ 01 декабря 2019

В TypeScript я хотел бы добавить методы расширения к примитивным типам таким образом, чтобы параметры и возвращаемые типы проверялись типом во время переноса.

Однако пока мне это не удалось,Я нашел много полезных тем на эту тему, ни одна из которых не предлагает решения. Поскольку все, что я нашел, довольно датировано, я хотел бы снова поднять эту тему.

Это то, что я пробовал до сих пор:

declare global {
    interface String {
        myCoolMethod(inputValue: number): string;
    }
}        

String.prototype.myCoolMethod = function (inputValue: number): string {
    return this + inputValue.toString();
};

И то же самое по-другому:

Object.defineProperty(String.prototype, "myCoolMethod", {
        value: function myCoolMethod(inputValue: number) : string {
            return this + inputValue.toString();
            },
            writable: true,
            configurable: true
        }
    );

Эти фрагменты работают, но нет проверки типов во время переноса и нет предупреждений об интеллектуальном значении в редакторе (Visual Studio). Я на VS2019 с TypeScript 3.7.

Есть ли (сейчас) способ объединения методов проверки типов и расширения в TypeScript?


Обновление:

См. мой ответ ниже, где я указываю на реальную проблему (для себя и для тех, кто может извлечь выгоду ...)

1 Ответ

0 голосов
/ 10 декабря 2019

Я отвечаю на свой вопрос, чтобы пометить его как решенный:

Проблема совершенно иная, чем я изначально думал. Как указал jcalz, это действительно дает мне ошибку типа, как и ожидалось:

const s = "hello";
console.log(s.myCoolMethod(123)); // hello123
s.myCoolMethod("oops"); // error, not a number

, но в моем коде потребления у меня было это, not , выдавая ошибку:

somebodysPackage.somebodysFunction().join(", ").myCoolMethod("oops");  // no error

Хотя функция Javascript join () всегда возвращает строку, TypeScript не находит мой метод расширения String, хотя он правильно выполняется Javascript во время выполнения.

Однако приведение результата somebodysFunction в строку[] изменяет это:

(somebodysPackage.somebodysFunction()) as string[]).join(", ").myCoolMethod("oops");  // type error

Теперь TypeScript знает тип ввода для join () и может вывести выходной тип, и моя функция расширения правильно расположена и выдана ошибка типа.

Наконец, установка файлов объявлений типов для somebodysPackage из npm решила проблему без явного приведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...