2016-11-29 51 views
0

我想添加一個屬性到javascript'Date'原型。如何將屬性添加到打字稿中的現有類型?

在JavaScript中,我只是這樣做:

Object.defineProperty(Date.prototype, "fullYearUTC", { 
    get: function() { return this.getUTCFullYear(); }, 
    enumerable: true, 
    configurable: true 
}); 

我覺得還是能夠做到的打字稿如下:

class Date 
{ 
    get fullYearUTC(): number { return this.getUTCFullYear() } 
} 

,但我得到的錯誤

Cannot redeclare block-scoped variable 'Date'. 

爲什麼不工作?

(請您是否不認爲這樣做沒有意見是一個好主意。這個問題不是這個。)

回答

3

不能創建一個類名爲Date,你可以有你自己的日期對象延伸它:

class MyDate extends Date { 
    get fullYearUTC(): number { 
     return this.getUTCFullYear(); 
    } 
} 

但是,如果要修改現有的Date你需要繼續做你與你的javascript代碼做了什麼。
至於它添加到TS類型,你需要使用它作爲一個接口:

interface Date { 
    readonly fullYearUTC: number; 
} 

或者你可以增加全局命名空間:

declare global { 
    interface Date { 
     readonly fullYearUTC: number; 
    } 
} 
+0

感謝。不過,我真的很喜歡使用打字稿來實現這些屬性。似乎是一種語言中的漏洞,國際海事組織。 – Spongman

+0

你正在使用typescript,例如,如果你有一個錯字並且寫了'configurabl:true',你會得到一個編譯錯誤,因爲這個對象與'PropertyDescriptor'類型不匹配。當你使用'interface Date'添加你的getter時,你使用的是打字稿,以便從現在開始,所有的日期實例(就打字稿而言)具有'fullYearUTC'。至於運行時方面,你只是不能重新聲明'Date'對象,而不是使用javascript或打字稿。 –

相關問題