TypeScriptで既存の型を拡張する場合にthisの型を考慮したい


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

[code]

    interface Array<T>{
       sum():number;
    }
    
    Array.prototype.sum = function(){
       return this.reduce((i,j)=>i+j)
    };
    
[/code]

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

[code]

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

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

後

[code]

    var a = [1,2,3,"4"].sum()
    
[/code]

で a が コンパイル前はnumber型ですが実行時の型がstringと  
間違った型になってしまいます。




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

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

[code]

    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();
    
[/code]




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

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

[code]

    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();
    
[/code]

