Расширение массива в импортированном файле с помощью TypScript 2 [duplicate]

Если вам интересно что-то более читаемое (но, конечно, не так эффективно), вы можете попробовать:

def compare_lists(list1, list2):
    if len(list1) != len(list2): # Weed out unequal length lists.
        return False
    for item in list1:
        if item not in list2:
            return False
    return True

a_list_1 = ['apple', 'orange', 'grape', 'pear']
a_list_2 = ['pear', 'orange', 'grape', 'apple']

b_list_1 = ['apple', 'orange', 'grape', 'pear']
b_list_2 = ['apple', 'orange', 'banana', 'pear']

c_list_1 = ['apple', 'orange', 'grape']
c_list_2 = ['grape', 'orange']

print compare_lists(a_list_1, a_list_2) # Returns True
print compare_lists(b_list_1, b_list_2) # Returns False
print compare_lists(c_list_1, c_list_2) # Returns False
36
задан user75525 18 October 2012 в 02:51
поделиться

5 ответов

Вы можете использовать прототип для расширения массива:

interface Array<T> {
   remove(o: T): Array<T>;
}

Array.prototype.remove = function (o) {
    // code to remove "o"
    return this;
}
47
ответ дан user75525 19 August 2018 в 08:20
поделиться
  • 1
    @FrancoisVanderseypen, который может быть болью, я предлагаю вам не попробовать. Это проще, предлагаемый здесь. Но если вам интересно: stackoverflow.com/a/14001136/340760 – BrunoLM 22 December 2013 в 21:41
  • 2
    он должен быть interface Array<T> { remove(o): T[]; } в новой версии с дженериками – Mariusz Pawelski 9 February 2014 в 02:04
  • 3
    Не работает, если модуль является внешним. – Gill Bates 13 September 2015 в 12:48
  • 4
    @GillBates никакие полиполки не работают из внешнего модуля. См. Комментарий Криса Сюэ от 7 июня. – user75525 14 September 2015 в 07:12
  • 5
  • 6
    Определения должны быть на одном уровне, чтобы вступить в силу, поэтому, если вы находитесь в модуле, и вы объявляете interface Array<T>, который является членом модуля, то есть MyModule.Array<T>. Это означает, что глобальный Array<T> не расширен, но создается новый локальный интерфейс. Вы должны поместить расширения в глобальную область ... Я бы предложил поместить интерфейс в файл .d.ts. Вам также нужно исправить определение массива или это просто интерфейс? – user75525 14 September 2015 в 09:54

Из TypeScript 1.6 вы можете «изначально» расширять произвольные выражения, например, встроенные типы.

Что нового в TypeScript :

ТипScript 1.6 добавляет поддержку классов, расширяющих произвольное выражение, которое вычисляет функцию-конструктор. Это означает, что встроенные типы теперь могут быть расширены в объявлениях классов.

В предложении extends класса ранее требовалась спецификация типа. Теперь он принимает произвольное выражение, за которым следует список аргументов типа. Тип выражения должен быть типом функции-конструктора с по меньшей мере одной сигнатурой конструкции, которая имеет такое же количество параметров типа, сколько количество аргументов типа, указанных в предложении extends. Тип возвращаемого имени (ов) соответствующей конструкции - это базовый тип, из которого наследуется тип экземпляра класса. Фактически это позволяет указывать как реальные классы, так и «классные» выражения в предложении extends.

// Extend built-in types

class MyArray extends Array<number> { }
class MyError extends Error { }

// Extend computed base class

class ThingA {
    getGreeting() { return "Hello from A"; }
}

class ThingB {
    getGreeting() { return "Hello from B"; }
}

interface Greeter {
    getGreeting(): string;
}

interface GreeterConstructor {
    new (): Greeter;
}

function getGreeterBase(): GreeterConstructor {
    return Math.random() >= 0.5 ? ThingA : ThingB;
}

class Test extends getGreeterBase() {
    sayHello() {
        console.log(this.getGreeting());
    }
}
6
ответ дан Alex 19 August 2018 в 08:20
поделиться
  • 1
    Это приводит к проблемам, поскольку оператор [] не может вести себя так, как ожидалось. [Д0] stackoverflow.com/questions/33947854/… – Andrew Shepherd 19 July 2016 в 22:02
  • 2
    @AndrewShepherd Очень хороший улов. – Alex 19 July 2016 в 22:22
class MyArray<T> extends Array<T> {
    remove: (elem: T) => Array<T> = function(elem: T) {
        return this.filter(e => e !== elem);
    }
}
let myArr = new MyArray<string>();
myArr.remove("some");

это работает для меня с машинописным текстом v2.2.1!

3
ответ дан chenxu 19 August 2018 в 08:20
поделиться
  • 1
    Эта проблема с этим подходом заключается в том, что теперь каждый массив должен иметь тип MyArray, поэтому он не будет работать с другими библиотеками, возвращающими массивы. – Jan Aagaard 18 July 2018 в 20:59

Добавление к ответу Рикки Гибсона,

export{}
declare global {
    interface Array<T> {
        remove(elem: T): Array<T>;
    }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(elem: T): T[] {
      return this.filter(e => e !== elem);
  }
}

Без ошибки экспорта {} TS «Расширения для глобальной области действия могут быть непосредственно вложены в внешние модули или декларации окружающего модуля».

3
ответ дан GAF 19 August 2018 в 08:20
поделиться

declare global, похоже, является билетом типа TypeScript 2.1. Обратите внимание, что Array.prototype имеет тип any[], поэтому, если вы хотите, чтобы ваша реализация функции проверялась на согласованность, лучше всего добавить параметр универсального типа.

declare global {
  interface Array<T> {
    remove(elem: T): Array<T>;
  }
}

if (!Array.prototype.remove) {
  Array.prototype.remove = function<T>(elem: T): T[] {
    return this.filter(e => e !== elem);
  }
}
30
ответ дан Rikki Gibson 19 August 2018 в 08:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: