8363


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と  
間違った型になってしまいます。


CC BY-SA 4.0
2015-03-25T04:26:09.510
8360
2022-06-12T02:33:34.050
2022-06-12T02:33:34.050
3054
8928
question
typescript
TypeScriptで既存の型を拡張する場合にthisの型を考慮したい


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

`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]


CC BY-SA 3.0
2015-03-25T05:30:08.827
8363
2015-03-25T05:55:25.237
2015-03-25T05:55:25.237
3068
3068
8360
answer


現在は [`this`
の型を宣言](https://www.typescriptlang.org/docs/handbook/2/functions.html#declaring-
this-in-a-function)できます。[2.0
から](https://www.typescriptlang.org/docs/handbook/release-
notes/typescript-2-0.html#specifying-the-type-of-this-for-functions)のようです。  
よって、次のように書けます。

[code]

    interface Array<T> {
        sum(this: number[]): number
    }
    
    Array.prototype.sum = function sum(this: number[]): number {
        return this.reduce((i, j) => i + j)
    }
    
    let t = [1, 2, 3].sum()  // OK
    
[/code]

これで、数値の配列以外に対し呼び出すとコンパイルエラーになります。

[code]

    let t2 = [1, 2, 3, "4"].sum()  // コンパイル時エラー 
    
[/code]


CC BY-SA 4.0
2022-06-12T02:29:37.823
89342
2022-06-12T02:29:37.823
3054
8360
answer