Я успешно реализовал некоторое расширение в машинописном тексте, которое работает, но я хотел бы вернуть этот тип вместо void.
interface Array<T> {
pushAll(other: T[]): void
randomize(): void
}
Array.prototype.pushAll = function <T>(other: T[]): void {
this.push(...other)
}
Array.prototype.randomize = function (): void {
this.sort(() => Math.random() * 2 - 1)
}
Но когда я пытаюсь это сделать, это дает ошибки компиляции:
interface Array<T> {
pushAll(other: T[]): this
randomize(): this
}
Array.prototype.pushAll = function <T>(other: T[]): this {
this.push(...other)
return this
}
Array.prototype.randomize = function (): this {
this.sort(() => Math.random() * 2 - 1)
return this
}
Ошибка: этот тип доступен только в нестатических....
Также предложение any[]
не работает.
Также я устал объявлять возвращаемый тип как T[]
без везения.
Я перехожу к машинописным текстам с языков более высокого уровня, таких как kotlin, swift, c#, Objective-C, где это вполне возможно, поэтому я могу писать функции, которые я могу связать, по-прежнему сохраняя безопасность типов. Спасибо.
(редактировать)
Я нашел обходной путь только для этого и некоторых других подобных случаев, возвращая тип Array<T>
. Но я могу определить возврат этого в интерфейсах и реализовать его, просто в определении функции прототипов это не сработает.
Это обходной путь, но не совсем то, что я ищу.
interface Array<T> {
pushAll(other: T[]): Array<T>
randomize(): Array<T>
}
Array.prototype.pushAll = function <T>(other: T[]): Array<T> {
this.push(...other)
return this
}
Array.prototype.randomize = function <T>(): Array<T> {
this.sort(() => Math.random() * 2 - 1)
return this
}
Решение состоит в том, чтобы полностью удалить типы из вашего определения. Поскольку typescript уже знает типы из объявления интерфейса, они будут применены к вашему определению через контекстная типизация.
Итак, ваш пример будет выглядеть так:
interface Array<T> {
pushAll(other: T[]): this
randomize(): this
}
Array.prototype.pushAll = function (other) {
this.push(...other)
return this
}
Array.prototype.randomize = function () {
this.sort(() => Math.random() * 2 - 1)
return this
}
Выглядит хорошо, но я должен протестировать его, прежде чем принять его, но, возможно, я поверю ему, поскольку теперь он кажется совершенно ясным Спасибо .. скоро вернусь к моей кодовой базе машинописного текста, так что обязательно попробую!
T — тип аргумента. Мне нужно вернуть тип self, но я нашел обходной путь только для этого случая, возвращая тип Array<T>. Так что это нормально для этого случая, пока все еще ищу, чтобы вернуть это для других случаев. Но я могу определить возврат этого в интерфейсах и реализовать его только в определении функции прототипов, это не сработает...