2017-06-13 72 views
0

我試圖在Array類中添加一個新方法(last)。通過向全局接口添加新方法來擴展Array類

這是我在做什麼(amoung等功能聲明),我test.ts文件:

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

if (!Array.prototype.last) { 
    Array.prototype.last = function <T>(): T { 
     return this[this.length - 1]; 
    } 
} 

但是,因爲它似乎完全擦除Array其他定義所以現在我得到的錯誤,這並不工作像:

TypeError: Cannot read property 'length' of undefined

發生這種情況,如果我嘗試訪問任何陣列的length財產。

我該如何正確實現?聲明是否必須自己進入文件?

+0

您使用的模塊系統?也就是說,你使用'import' /'export'嗎? –

+0

@NitzanTomer不,我只是在我使用它的同一個文件中有這個聲明。IntelliJ不顯示任何錯誤,但是一旦我編譯它,我得到錯誤 – smac89

+0

@NitzanTomer,其實我有一些進口的頂部文件。這會改變什麼嗎? – smac89

回答

1

您只需要在導入/導出時增加全局模塊。

因爲這不是你的情況,你只需要做到這一點:

interface Array<T> { 
    last(): T; 
} 

也就是說,不declare global { ... }包裹。

而且,在實際執行中,沒有必要爲仿製藥,它可以/應該是:

if (!Array.prototype.last) { 
    Array.prototype.last = function(): any { 
     return this[this.length - 1]; 
    } 
} 
+1

感謝您的快速響應。我現在得到以下錯誤:'屬性'最後'不存在於類型'字符串[]''和'屬性'最後'不存在於類型'任何[]'' – smac89

+0

錯誤在我有' Array.prototype.last'和基本上其他地方我使用'someArray.last()' – smac89