Как вернуть этот собственный тип из функции расширения в машинописном тексте

Я успешно реализовал некоторое расширение в машинописном тексте, которое работает, но я хотел бы вернуть этот тип вместо 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>. Но я могу определить возврат этого в интерфейсах и реализовать его, просто в определении функции прототипов это не сработает.

T — тип аргумента. Мне нужно вернуть тип self, но я нашел обходной путь только для этого случая, возвращая тип Array<T>. Так что это нормально для этого случая, пока все еще ищу, чтобы вернуть это для других случаев. Но я могу определить возврат этого в интерфейсах и реализовать его только в определении функции прототипов, это не сработает...

Renetik 22.05.2019 12:13
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
1
1
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это обходной путь, но не совсем то, что я ищу.

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
}

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

Renetik 30.10.2019 14:15

Другие вопросы по теме