TypeScript是否有像Kotlin一样的扩展?

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中做同样的事情,或者是否有计划在未来支持?

没有这样的事情,我怀疑它将来会出现,主要原因就是没有理由这样做。
在像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] 

( 代码在操场上 )