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