如何将`.ToList()`方法添加到Typescript`Array <t>`类中?

时间:2016-04-23 00:40:02

标签: typescript ecmascript-6

如何将.ToList()方法添加到Typescript的Array<T>类中。我期待最终的结果如下。

let nums:List<number> = [1,2,3,5,6].ToList();
let strs:List<string> = ["abc", "cdf", "efg"].ToList();

如果有任何git repo示例,请分享。

我收到以下错误。

enter image description here

没有导出界面我收到以下错误

enter image description here

4 个答案:

答案 0 :(得分:0)

您可以通过将该函数添加到 Array.prototype ,以Javascript方式执行此操作。但是,如果你想要类型安全,你将不得不做一些类型的断言。

将函数添加到Array原型中:

(<any>Array.prototype).ToList = function() {
    return this.join(",");
}

TypeScript允许您通过重新声明接口并添加自己的函数来扩展接口:

interface Array<T> {
    ToList: () => string
}

断言要调用ToList的数组是接口类型:

let a = [1,2,3,5,6].ToList();

答案 1 :(得分:0)

Array的接口是可扩展的,因为typescript中的所有接口都是可扩展的。一个简单的例子:

list.d.ts:

interface Array<T> {
  ToList():List;
} 

list.ts:

/// <reference "./list.d.ts" />  
Array.prototype.ToList = function() {
  return this.toString();
} 

使用它:

let arr = [1,2,3]
let list = arr.ToList();

答案 2 :(得分:0)

只是不要export界面,你的代码将编译没有错误。

class List<T> {
    constructor(items: T[]) {}
}

interface Array<T> {
    ToList():List<T>;
}

Array.prototype.ToList = function() {
    return new List(this);
};

TypeScript playground

上试试

编辑#1

看起来从模块中导出字面意思会破坏编译,并导致OP的错误。我向微软提交了一个问题。请参阅:https://github.com/Microsoft/TypeScript/issues/8278

编辑#2

好的,事实证明在上面的示例中添加导出语句(字面上导出任何内容)会导致OP的错误。微软的人回答了我们的问题,结果我们没有正确地指定Array接口的类型信息。所以这是如何做到的:

class List<T> {
    constructor(items: T[]) {}
}

declare global {
    interface Array<T> {
        ToList():List<T>;
    }
}

Array.prototype.ToList = function() {
    return new List(this);
};

export default List;

答案 3 :(得分:0)

最后我得到了答案。

declare global {
    interface Array<T> {
        ToList(): List<T>;
    }
}

Array.prototype.ToList = function() {
    return new List(this);
}`

export class List<T> {
    constructor(private array: T[] = []) {}

     public Add(item: T): List<T> {
        this.array.push(item);
        return this.array.ToList();
    }
}