一般的なタイプ
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;
}
ご覧いただきありがとうございます。