LoginSignup
2
2

More than 5 years have passed since last update.

TypeScriptでジェネリクスの型引数から自動でデフォルト値を設定するのは無理そう?

Last updated at Posted at 2018-07-03

経緯

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' に割り当てることはできません。
    }
}
2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2