

お世話になります。

TypeScriptでリテラル型を用いる時、値を動的生成する場合のベストプラティクスをお聞きしたいです。

[code]

    type valueType = 'foo_1' | 'foo_2';
    
    const prefix = ( value: string ): string => {
        const prefix = 'foo';
        return `${prefix}_${value}`;
    }
    
    const process = (): valueType => {
        if ( /* 省略 */ ) {
            return prefix('1');
        } else {
            return prefix('2');
        }
    }
    
[/code]

例えばこんなコードがあったとして、プレフィックスが今後変わる可能性があり動的に生成しています。  
当然return文では以下のエラーが出力されます。

[code]

    型 'string' を型 'valueType' に割り当てることはできません。ts(2322)
    
[/code]

## 解決策1：型アサーション

[code]

    const process = (): valueType => {
        if ( /* 省略 */ ) {
            return prefix('1') as 'foo_1';
        } else {
            return prefix('2') as 'foo_2';
        }
    }
    
[/code]

どう見ても無駄でしかなく、どのみちプレフィックスが変わったら修正が必要なので最初から`return 'foo_1'`とベタ書きした方がマシ。  
→それでも明示的な型指定をしている分マシなのか？

## 解決策2：リテラル型をやめる

そもそもリテラル型をやめて型推論に任せる。  
→しかし`foo_1`と`foo_2`以外が入る可能性は0で、可能であればstring型ではなくリテラル型で縛りたい。

# どう表現するべきでしょうか

TypeScript1週間程度の素人で、中々どうするのが一番良いのか思いつきませんでした。  
ジェネリクスを使ってできるのではないか？と試行錯誤したんですが、まだまだTypeScriptの基礎レベルでこれが可能か否か分かっておりません。

  * リテラル型をやめて型推論で十分
  * 動的生成（プレフィックス付与）をやめるべき
  * ジェネリクス型でできる/できない

様々な知見を諸先輩方にお伺いできれば幸いです。  
お手数おかけ致しますがよろしくお願い致します。


CC BY-SA 4.0
2022-01-31T08:59:42.930
86036
2022-02-04T11:49:18.370
51174
question
typescript
リテラル型の型宣言において、動的に値を生成する時のベストプラティクス


どういうことを実現したいのか理解することができませんでしたが、[テンプレートリテラル型(Template Literal
Types)](https://www.typescriptlang.org/docs/handbook/2/template-literal-
types.html)が利用できるのではないでしょうか。

[code]

    type Prefix = "foo";
    type Postfix = "1" | "2";
    type ValueType = `${Prefix}_${Postfix}`;
    
    const prefix = (value: Postfix): ValueType => {
      const prefix = "foo";
      return `${prefix}_${value}`;
    };
    
    const process = (i: number): ValueType => {
      if (i > 0) {
        return prefix("1");
      } else {
        return prefix("2");
      }
    };
    
    console.log(process(10)); // "foo_1"
    console.log(process(-10)); // "foo_2"
    
[/code]

([Playground](https://www.typescriptlang.org/play?#code/C4TwDgpgBACgThAZgSwB5QLxQESIPZ7YDcAUKJLHgM7ArpbYCM2UAPjgEzFnjQBqAQwA2AVwgAVXpigADACQBveEjQBfAPqKY1WmpmkSAYzwA7GlDAI60gBQA3YWIBclGnQCULwaIlSMAPigFEigoYzNgCys0aVwCblCEYBE4E1lFSxVUDUUHH1V9ElUDcPNLPEMIKipbZBcTEQBbACMIOE8obzFJCgCgkKhkRCgbZChAgAZ3ftDEiGTUqKybJmx3UlDVKAghKmhg2agklLTMuhWudYHVIpLTKjwhCAA6ITwAcxtyyuqbRin1lAAPRAnD4PDqZhGe6PF5vT7fKpUGwAWn+7kBILBBHUXBIQA))


CC BY-SA 4.0
2022-02-04T11:49:18.370
86147
2022-02-04T11:49:18.370
2808
86036
answer