91184


まず、クラスを利用したコンポーネントを２つ用意します。

[code]

    class AdminInfoComponent {
      public userCount: number = 0;
    }
    
[/code]

[code]

    class UserComponent {
      public id: string = "";
      public createdAt: number = 0;
    }
    
[/code]

次に、クラスのプロパティ（コンポーネントのフィールド）名を取得する型を作ります。

[code]

    type ExtractFields<T> = {
      [K in keyof T]: K
    }[keyof T];
    
[/code]

参考：  
<https://stackoverflow.com/questions/55479658/how-to-create-a-type-excluding-
instance-methods-from-a-class-in-typescript>

例えば、この型をそれぞれのコンポーネント（クラス）に適用すると以下のようになります。

[code]

    let test1: ExtractFields<AdminInfoComponent>; // "userCount"
    let test2: ExtractFields<UserComponent>; // "userID" | "createdAt"
    
[/code]

ここで私は型に設定するコンポーネントがユニオン型（２通り以上のケース）の場合も正常に実行できるのかを確認したところ、

[code]

    let test3: ExtractFields<AdminInfoComponent | UserComponent>; // NEVER
    
[/code]

まさかの`never`でした。予想してた（求めてた）型：`"userCount" | "userID" | "createdAt"`

`never`になる理由が分からず、どこを修正したら求めてた型が返されるのかがいつまで経っても分からないので質問させていただきました。  
よろしくお願いします。


CC BY-SA 4.0
2022-09-18T04:26:41.867
91152
2022-09-20T00:36:42.590
2022-09-20T00:05:43.333
3060
35941
question
typescript
ユニオン型クラスでプロパティ名を取得する型について


求める型はこれだろうと思います。

[code]

    let test3: ExtractFields<AdminInfoComponent> | ExtractFields<UserComponent>
    
[/code]

* * *

質問中ではあえて省略した部分があるのだと思いますが、そうでないならば、`ExtractFields` は単純な `keyof`
で代替できると思います（念のため）。

[code]

    let test1: keyof AdminInfoComponent
    let test2: keyof UserComponent
    let test3: keyof AdminInfoComponent | keyof UserComponent
    
[/code]


CC BY-SA 4.0
2022-09-19T22:12:12.737
91184
2022-09-20T00:36:42.590
2022-09-20T00:36:42.590
3054
3054
91152
answer