2016-04-23 42 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(); 
    } 
} 
相關問題