2016-04-23 41 views
0

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

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

+0

什么是List接口?在你的代码中定制的东西? – toskv

+0

是的..列表是我自己的实现.. –

+0

为什么Array和List在你的屏幕截图中是红色的? –

回答

0

你可以做到这一点的JavaScript的方式,通过添加功能到Array.prototype收到下面的错误。但是,如果你想要类型安全,你将不得不做一些类型的断言。

功能添加到阵列原型:

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

打字稿,您可以通过重新声明它们并添加自己的功能扩展接口:

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

断言数组你想打电话给ToList就是接口类型:

let a = [1,2,3,5,6].ToList(); 
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(); 
+0

我也这么做了。但得到错误。我附上截图FYR。 –

+0

你正在使用什么版本的打字稿?我在[Typescript游乐场](https://www.typescriptlang.org/play/)中对上述内容进行了测试并正确编译。 – ArcSine

+0

啊我看到了问题,你得到的错误是由于出口。如果你想导出界面,你需要定义一个单独的.d.ts文件并包含它。 – ArcSine

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; 
+0

由于我的代码中'class'前面的'export'导致错误。如果没有'export',我不能在另一个'ts'文件中使用这个类。 –

+0

@NatarajanGanapathi这看起来像打字稿中的一个错误。我提交了一个问题(请参阅我的更新),将会看到它应该如何工作。 –

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(); 
    } 
} 
相关问题