吉本集の個人ブログ
Web制作の技術について書いています。たまに日記も書きます。

【TypeScript】ジェネリック型について vol.2

2014年10月20日 / category : typescript

ジェネリックの仕組みについて、「なぜ?」というコンパイルエラーがあります。

TypeScript
function myFunc<T,U>(t:T, u:U){
	return t + u;
};
console.log( myFunc<number, number>(100, 1) ); //コンパイルエラー

こ、これです。

’101′
が出力されるかな・・・と思いきや、コンパイルエラーです。

gruntでコンパイルしていますが、下記がそのエラー文です。

error TS2111: Invalid ‘+’ expression – types not known to support the addition operator.

‘+’が無効だそうです。
なぜだ。。。

ふむ、では、次のように記述だとどうでしょう。

TypeScript
function myFunc<T>(t:T, u:T){
	return t + u;
};
console.log( myFunc<number>(100, 1) ); //コンパイルエラー

これもだめ・・・。
なぜだ・・・。

TypeScript
function myFunc<T>(t:T, u:T){
	console.log( typeof t, typeof u );
};
myFunc<number>(100, 1);

引数の型を取得してみた。

‘number number’

そうでしょ?
じゃ~、なんで?

TypeScript
function myFunc(t:number, u:number){
	return t + u;
};
console.log( myFunc(100, 1) );

初心に戻ってみた。

’101′

そりゃそうだ。

TypeScript
function myFunc<T>(t:T, u:T){
	return Number(t) + Number(u);
};
console.log( myFunc<number>(100, 1) );

引数をNumberオブジェクトに変換!

’101′

そりゃそうだ。
いや、それだと、ジェネリックの意味ないし。。。
ん~。

TypeScript
function myFunc<T>(t:T, u:T):T{
	return t + u;
};
console.log( myFunc<number>(100, 1) ); //コンパイルエラー

もももも、もしかして、関数の返り値にもジェネリック型の指定が必要???
これでうまくい・・・・・・・かない。コンパイルエラー・・・。

仕方ない・・・、extendsで制約しちゃいますか・・・。
ジェネリック型の意味なくなるけど・・・。

TypeScript
function myFunc<T extends number>(t:T, u:T):T{
	return t + u;
};
console.log( myFunc<number>(100, 1) ); //コンパイルエラー

って、これもダメかい~。

で、いま自分はここです。
色々試した結果・・・何もわからず。

「TypeScriptのルールだ!」

ということで自分を落ち着かせています。。。
どなたか、わかる方いらっしゃいますか・・・。

いまのところの自分の見解。

ジェネリック型で指定した引数に対しては、’+'などの演算子は使用できない!

マジっすか。。。
引き続き、調査します。。。