2017-10-20 13 views
0

標準のNode.jsライブラリの型定義では、インターフェイスDateConstructorの定義が見つかりました。TypeScriptインターフェイスの署名 "():文字列"

interface DateConstructor { 
    new(): Date; 
    new(value: number): Date; 
    new(value: string): Date; 
    new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; 
    (): string; 
    readonly prototype: Date; 
    /** 
     * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970. 
     * @param s A date string 
     */ 
    parse(s: string): number; 
    /** 
     * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date. 
     * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year. 
     * @param month The month as an number between 0 and 11 (January to December). 
     * @param date The date as an number between 1 and 31. 
     * @param hours Must be supplied if minutes is supplied. An number from 0 to 23 (midnight to 11pm) that specifies the hour. 
     * @param minutes Must be supplied if seconds is supplied. An number from 0 to 59 that specifies the minutes. 
     * @param seconds Must be supplied if milliseconds is supplied. An number from 0 to 59 that specifies the seconds. 
     * @param ms An number from 0 to 999 that specifies the milliseconds. 
     */ 
    UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number; 
    now(): number; 
} 

declare const Date: DateConstructor; 

これには奇妙な定義(): stringが含まれています。どのように私はクラスで定義することができます、このインターフェイスを実装したいですか?

定義はクラスのコンストラクタもnewなしと呼ばれる文字列を返す引数なしで呼び出し可能な関数であることを意味し:

+1

[TypeScript:コンストラクタを使用した機能インターフェイス]の複製があります(https://stackoverflow.com/questions/46809986/typescript-functional-interface-with-constructor/46812163#46812163) – jcalz

答えて

1

場合、あなたはこの質問がthe other one I linked toから十分に異なっていると思います。 ES2015 - または - laterclassを使用することはできません。newなしでTypeErrorを呼び出す必要があるため、仕様に準拠することはできません。代わりに、newで呼び出されたことを検出する関数を返すことができます。静的メソッドを実装するために追加のプロパティが追加されています。

組み込みのDateコンストラクタオブジェクトのラッパーを提供する例を示します。

interface FunctionalPartOfDateConstructor { 
    new(): Date; 
    new(value: number): Date; 
    new(value: string): Date; 
    new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; 
(): string; 
} 

今度は、ちょうどその部分を実装してみましょう:私はnew.targetを使用

const funcPart = function(valueOrYear?: number | string, month?: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date | string { 
    if (typeof new.target === 'undefined') { 
    // called as function 
    return Date(); 
    } 
    if (typeof valueOrYear === 'undefined') { 
    // called as constructor with no arguments 
    return new Date(); 
    } 
    if (typeof valueOrYear === 'string') { 
    // called as constructor with string value argument 
    return new Date(valueOrYear); 
    } 
    if (typeof month === 'undefined') { 
    // called as constructor with number value argument 
    return new Date(valueOrYear); 
    } 
    // called as constructor with year, month, date, etc arguments: 
    return new Date(valueOrYear, month, date, hours, minutes, seconds, ms); 
} as FunctionalPartOfDateConstructor; 

注まずはnewキーワードの有無にかかわらずどちらか、関数のように動作するインタフェースの一部を説明してみましょうその関数がnewで呼び出されたかどうかを検出します。これはES5をターゲットとしたときに妥当なものになると私は思う。また、すべての異なるオーバーロードシグネチャの違いを分別する必要があることに注意してください。

今、私たちは、静的メソッドを実装して何かを持つ機能的な部分をマージすることにより、完全なDateConstructorインスタンスを作ることができます。

const myDateConstructor: DateConstructor = Object.assign(funcPart, { 
    prototype: Date.prototype, 
    parse(s: string) { 
    return Date.parse(s); 
    }, 
    UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number) { 
    return Date.UTC(year, month, date, hours, minutes, seconds, ms); 
    }, 
    now() { 
    return Date.now(); 
    } 
}) 

あなたはtry it on the TypeScript Playgroundあなたが望むことができるかどうか。希望は助けます。がんばろう!

+0

ありがとうございます。それは私を非常に助けます。 – akazakou