2016-12-10 3 views
4

Kotlin имеет функцию, называемую Extensions, которая позволяет вам «расширять» любой тип (включая встроенные типы), фактически не расширяя его.Имеет ли TypeScript расширения, такие как Kotlin?

Например:

function Array<T>.swap(i1: number, i2: number) { 
    let tmp = this[i1] 
    this[i1] = this[i2] 
    this[i2] = tmp 
} 

let list = [1, 2, 3] 
list.swap(0, 2) 
console.log(list) // => 3, 2, 1 

Забавная часть является то, что, в отличие от нормального расширения типов базовых, этот подход не изменяет массив или его цепь прототипов.

Сформированный JS код будет что-то вроде:

function _array_extensions_swap(i1, i2) { 
    let tmp = this[i1] 
    this[i1] = this[i2] 
    this[i2] = tmp 
} 

let list = [1, 2, 3] 
_array_extensions_swap(list, 0, 2) 
console.log(list) // => 3, 2, 1 

Интересно, если это возможно, чтобы сделать то же самое в машинописи, или если есть планы поддержки, которые в будущем?

+0

Я предположил бы, что это не в планах, кажется, отклониться слишком много от JavaScript. Предполагается, что TypeScript остается относительно близким к JavaScript в надежде, что JavaScript будет использовать свои функции в будущем. Я думаю, что ваш вопрос должен быть: будет ли это предлагать JavaScript? –

ответ

0

Нет такой вещи, и я сомневаюсь, что это произойдет в будущем, главная причина этого в том, что для этого нет оснований.
В скомпилированных языках, как Котлин вы не можете просто добавить новые свойства существующих экземпляров, но в JavaScript (и для этого с машинопись Aswell), вы можете просто сделать:

let list = [1, 2, 3] as number[] & { swap(i1: number, i2: number): void }; 
list.swap = function (i1: number, i2: number) { 
    let tmp = this[i1] 
    this[i1] = this[i2] 
    this[i2] = tmp; 
} 

list.swap(0, 2); 
console.log(list); // [3, 2, 1] 

Вы можете создать фабричную функцию, чтобы расширить существующие списки :

function extend<T>(list: T[]): T[] & { swap(i1: number, i2: number): void } { 
    (list as T[] & { swap(i1: number, i2: number): void }).swap = function (i1: number, i2: number) { 
     let tmp = this[i1] 
     this[i1] = this[i2] 
     this[i2] = tmp; 
    } 

    return list as T[] & { swap(i1: number, i2: number): void }; 
} 

let list = extend([1, 2, 3]); 
list.swap(0, 2); 
console.log(list); // [3, 2, 1] 

(code in playground)

+0

Как вы планируете на самом деле использовать его? Собираетесь ли вы добавить 10-20 таких функций для каждого экземпляра массива в вашем коде? А также для String.isBlank/isPresent/reverse и т. Д. –

+0

Проверьте мой пересмотренный ответ. Функция 'extend' может добавить то, что когда-либо нужно для экземпляров –

+0

Это хорошо известный подход с огромным недостатком. У этого есть ужасная производительность (вы должны хранить кучу funcs на каждом созданном объекте), а также довольно многословный с необходимостью явно расширять каждый Array/String и другие. –

Смежные вопросы