TypeScriptを使用する際の注意事項

一般的なタイプ

Number、String、Boolean、 Object

Number、String、BooleanまたはObjectのタイプを決して使用しないでください。

これらのタイプは、非プリミティブ オブジェクトを参照します。 Java、C++ などの言語の場合、これらのタイプは有効です。

/* WRONG */
function reverse(s: String): String;

但し、TypeScriptではこのタイプの宣言は認識されません。

代わりにnumber、string、boolean、object を使用してください。

/* OK */
function reverse(s: string): string;

コールバックのタイプ

コールバックの戻り値のタイプ

値が無視されるコールバック内の関数の戻り値にany型を使用しないでください。

/* WRONG */

function fn(x: () => any) {

    x();

}

代わりにvoid型を使用してください。

/* OK */

function fn(x: () => void) {

    x();

}

理由: void を使用すると、x の戻り値を意図せずに使用することが防止されるため、より安全です。

function fn(x: () => void) {

    var k = x(); // oops! meant to do something else

    k.doSomething(); // error, but would be OK if the return type had been ‘any’

}

コールバック内のオプションパラメータ

必要な場合以外はコールバック関数でオプションのパラメータを使用しない方がいいです。

/* WRONG */

interface Fetcher {

    getObject(done: (data: any, elapsedTime?: number) => void): void;

}

これは、実行されたコールバックが 1つまたは2つのパラメータで呼ばれる可能性があることを意味します。 筆者の意図は、コールバックが elapsedTime パラメータをきにしないかもしれませんが、オプションパラメータを使用してこれを実装する必要はありません。なぜなら、より少ないパラメータを受け入れるコールバックを提供することは常に正当です。

代わりに、コールバック内のパラメータを非オプションとして書いてください。

/* OK */

interface Fetcher {

    getObject(done: (data: any, elapsedTime: number) => void): void;

}

オーバーロードとコールバック

関数パラメータのみが異なる個別のオーバーロードを作成しないでください。

/* WRONG */

declare function beforeAll(action: () => void, timeout?: number): void;

declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void;

代わりに、最大のパラメーターを持つ単一のオーバーロード関数を作成してください。

/* OK */

declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void;

関数のオーバーロード

特定のオーバーロード関数の前に一般的なオーバーロード関数を書かないでください。

/* WRONG */

declare function fn(x: any): any;

declare function fn(x: HTMLElement): number;

declare function fn(x: HTMLDivElement): string;

var myElem: HTMLDivElement;

var x = fn(myElem); // x: any, wat?

代わりに、特定のオーバーロードを最初に宣言してください。

/* OK */

declare function fn(x: HTMLDivElement): string;

declare function fn(x: HTMLElement): number;

declare function fn(x: any): any;

var myElem: HTMLDivElement;

var x = fn(myElem); // x: string, : )

理由: TypeScript は最初に宣言されたオーバーロード関数を選択します。

オプションパラメータの使用

渡されるパラメータのみが異なるオーバーロード関数を書かないでください。

/* WRONG */

interface Example {

    diff(one: string): number;

    diff(one: string, two: string): number;

    diff(one: string, two: string, three: boolean): number;

}

代わりに、可能な限りオプションパラメータを使用してください。

/* OK */

interface Example {

    diff(one: string, two?: string, three?: boolean): number;

}

ユニオンタイプの使用

引数の位置のみが異なるオーバーロード関数を書かないでください。

/* WRONG */

interface Moment {

    utcOffset(): number;

    utcOffset(b: number): Moment;

    utcOffset(b: string): Moment;

}

代わりに、ユニオンタイプを使用してください。

/* OK */

interface Moment {

    utcOffset(): number;

    utcOffset(b: number|string): Moment;

}

ご覧いただきありがとうございます。