2016-11-29 3 views
0

javascript 'Date'プロトタイプにプロパティを追加しようとしています。typescriptの既存の型にどのようにプロパティを追加しますか?

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

は私がちょうどtypescriptですで次の操作を行うことができるだろうと思った:

JavaScriptでは、私はちょうどこれを行うだろう

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

を私はエラーを取得

Cannot redeclare block-scoped variable 'Date'. 

なぜこれは機能しませんか?

(いいえ、あなたがこれを行うことは良いアイデアだと思うかどうかについてのコメント。この質問は、そのことについてではありませんしてください。)あなたはDateという名前のクラスを作成することはできません

答えて

3

、あなたがあなた自身の日付を持つことができますそれを拡張するオブジェクト:

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

感謝を。しかし、実際にはtypescriptを使ってプロパティを実装したいと思っています。言語の穴のように思える、IMO。 – Spongman

+0

あなたはタイプミスを使用しています。たとえば、タイプミスがあって 'configurabl:true'と書くと、オブジェクトが' PropertyDescriptor'タイプと一致しないのでコンパイルエラーが発生します。そして、あなたはgetterを 'interface Date'を使って追加するときにtypescriptを使用していますので、今からすべての日付のインスタンス(typescriptに関わらず)に' fullYearUTC'があります。ランタイムアスペクトに関しては、javascriptやtypescriptではなく、 'Date'オブジェクトを再宣言することはできません。 –

関連する問題