TypeScript有像Kotlin这样的扩展吗?

时间:2016-12-10 14:15:10

标签: typescript

Kotlin有一个名为Extensions的功能,可以让你扩展"任何类型(包括内置类型)都没有实际扩展它。

例如:

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

我想知道是否有可能在TypeScript中做同样的事情,或者是否有计划在未来支持它?

1 个答案:

答案 0 :(得分:0)

没有这样的东西,我怀疑它将来会出现,主要原因是没有理由这样做。
在像kotlin这样的编译语言中,你不能简单地向现有实例添加新属性,但是在javascript中(以及带有typescript的那些)你可以简单地做:

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