如何将.ToList()
方法添加到Typescript的Array<T>
类中。我期待最终的结果如下。
let nums:List<number> = [1,2,3,5,6].ToList();
let strs:List<string> = ["abc", "cdf", "efg"].ToList();
如果有任何git repo示例,请分享。
我收到以下错误。
没有导出界面我收到以下错误
答案 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);
};
上试试
编辑#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();
}
}