75049


Typescriptで以下のようなinterfaceを書き、`func`に代入します。

[code]

     interface hoge{
      (str:string):void;
      text?:string;
     }
    
    let func:hoge = (str:string) => {console.log(str)};
    
    
[/code]

このように変数`func`に代入するとエラーなくコンパイルされますが、  
オプションである`text`を`func`に代入する時点で指定することはできますか？


CC BY-SA 4.0
2021-04-02T13:53:35.773
75046
2021-04-02T16:04:34.687
2021-04-02T14:02:14.280
44610
44610
question
typescript
Typescriptのinterfaceにおけるアロー関数とオプションのメンバについて。


stackoverflow.comでの類似質問  
<https://stackoverflow.com/q/12766528/4366193>

例えばinterfaceのインスタンスを生成するBuilderを定義する方法があります。

※`hoge` という変数を使いたかったので、interfaceは `Hoge` に変えさせていただきました。

[code]

     interface Hoge {
      (str:string):void;
      text?:string;
     }
    
    const hogeBuilder = (f: (str: string) => void, text?: string): Hoge => {
      const hoge: Hoge = f;
      hoge.text = text;
    
      return hoge;
    };
    
    const func1: Hoge = hogeBuilder((str:string) => { console.log(str); });
    
    const func2: Hoge = hogeBuilder((str:string) => { console.log(str); }, 'text exists');
    
    func1('Hello');
    console.log(`func1.text: ${func1.text}`);
    
    func2('Hello, world');
    console.log(`func2.text: ${func2.text}`);
    
[/code]

または、即時実行関数を使って生成したものを返す方法も考えられます。

[code]

     interface Hoge {
      (str:string):void;
      text?:string;
     }
    
    const func: Hoge = (() => {
      const hoge: Hoge = (str:string) => { console.log(str); };
      hoge.text = 'text exists';
    
      return hoge;
    })();
    
[/code]

他には `Object.assign()` を使用する方法もあるようです。

[code]

     interface Hoge {
      (str:string):void;
      text?:string;
     }
    
    const func: Hoge = Object.assign(
       (str: string) => { console.log(str); },
       { text: 'fuga' }
    );
    
[/code]


CC BY-SA 4.0
2021-04-02T15:26:39.680
75049
2021-04-02T16:04:34.687
2021-04-02T16:04:34.687
3068
3068
75046
answer