typescriptで既存の型を拡張する場合の問題

投稿者: Anonymous

typescriptで既存の型を拡張する場合 interfaceを使って例えばsum関数であれば

interface Array<T>{
   sum():number;
}

Array.prototype.sum = function(){
   return this.reduce((i,j)=>i+j)
};

このように書けますが、上記の場合 number|stringの配列

[1,2,3,"4"].sum() //64

と書いてもコンパイルエラーになりません(当たり前ですが)
Array< number >にのみsumを追加させ
他の型ではコンパイルエラーにさせたいのですが可能でしょうか。


var a = [1,2,3,”4″].sum()
で a が コンパイル前はnumber型ですが実行時の型がstringと
間違った型になってしまいます。

解決

とりあえず思いついた方法としては、下記の様な記述です。

var a =と書くと型推論によってaの型が決定されますので、型を明示する場合はvar a: number =と書きます。

interface Array<T> {
    sum(): T;
}

Array.prototype.sum = function () {
    return this.reduce((i: any, j: any) => i + j);
};

// エラー: Type 'string | number' is not assignable to type 'number'. Type 'string' is not assignable to type 'number'.
var a: number = [1, 2, 3, "4"].sum();

// OK
var num: number = [1, 2, 3, 4].sum(); // num === 10
var str: string = ["1", "2", "3", "4"].sum(); // str === "1234"

var numbers: number[] = [1, 2, 3, 4];
var sum = numbers.sum();
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *