経緯
C#だとdefault(T)といった感じで型引数の型の、デフォルトの値が引いてこれるのですが、TypeScriptでも似たようなものが欲しいと思いました。
色々調べてみましたが、ジェネリクスの型引数から任意の初期値を引いてくる、というのは難しそうでした。
どなたかやり方知っていたら教えてください…。
環境
TypeScript: 2.9.2
試してダメだったコード
DefaultValueOfTypes.ts
const DefaultValues: [number, string] = [0, ''];
//ジェネリクスの特殊化とかできないかなーとか思ってやってみたけどTypeScriptは特殊化できないぽい?
class Default<T>{
public static get value(){return this._value;}
protected static _value(){return null;}
}
class Default<number> extends Default<number>
{protected static _value(){return 0;}}
class Default<string> extends Default<string>
{protected static _value(){return '';}}
function GetDefault<T>(): T{
if(this instanceof GetDefault2<number>
{return 0;}
else if(this instanceof GetDefault2<string>)
{return '';}
return null;
}
type allowed_type = Default<number> | Default<string>;
function GetDefault2(x: allowed_type){
if(x instanceof Default<number>)
{return 0;}
else if(x instanceof Default<string>)
{return '';}
return null;
}
interface IValueContainer<T>{
value: T;
}
class ValueContainer<T>{
private _value: T;
public get value(){return this._value;}
public constructor(){
//this._value = default(T); //<-- C#だとこんな感じでデフォルト値指定できる
this._value = DefaultValues as T; //<-- 型 '[number, string]' を型 'T' に変換できません。
this._value = Default<T>.value; //<-- 型 'typeof Default' の値は呼び出せません。'new'を含めますか?
this._value = GetDefault<T>(); //ここでのコンパイルエラーは起きない。先が死んでるから意味ないけど。
this._value = GetDefault2(new Default<T>()); //<-- 型 '0 | ""' を型 'T' に割り当てることはできません。型 '0' を 型 'T' に割り当てることはできません。
}
}