TypeScriptは、ジェネリックパラメータと同じベースのオブジェクトを返すことはできません

カイル

BaseEntityを拡張するエンティティに基づいて構成値を返すファクトリがあります。ただし、ジェネリックパラメーターと同じシグネチャを持つ型を関数から返すことができないという型エラーが発生Collection<A> is not assignable to type Collection<T>Type A is not assignable to type Tます。具体的にはTypeとそのです。しかし、この例では同じ定義AT持っていませんか?

type BaseTypes = 'a';

interface Base {
  type: BaseTypes;
  id: number;
}

interface A extends Base {
  type: 'a';
  name: string;
}

interface Collection<T extends Base> {
  items: T[];
}

function getCollection<T extends Base>(obj: T): Collection<T> | null {
  switch (obj.type) {
    case 'a':
      return getACollection(); // Type Collection<A> is not assignable to type Collection<T>
    default:
      return null;
  }
}

function getACollection(): Collection<A> {
  return { items: [] };
}
TitianCernicova-Dragomir

Typescriptは、タイプガードが機能するために共用体型を必要としBaseます。これは、派生インターフェイスの基本型ですが、共用体ではないため、コンパイラが絞り込むための共用体はありません。

2番目の問題は、ユニオンを拡張したとしてもTypescriptがジェネリック型を絞り込まないことです(これは将来のリリースで変更されると思いますが、見つかった場合はgithubの問題を投稿します。編集 これは問題ですがどうやらそれを実装する計画はありません)。ただし、パラメーターの型を絞り込んだとしても、パラメーターを絞り込んだだけであり、型ガードは関数の戻り型に影響を与えません。タイプガードは、影響が非常に狭いです。

問題の最も簡単な解決策は、関数に2つの異なるシグネチャを設定BaseすることCollection<Base>です。ジェネリックパラメータを使用するパブリックシグネチャと、を取得して返すジェネリックを含まないプライベートシグネチャです実装はBase別の派生の1つの派生を取り込んでコレクションを返す可能性があるため、これは完全にタイプセーフなソリューションではありませんが、現時点で実行できる最善の方法です。

function getCollection<T extends Base>(obj: T): Collection<T> | null
function getCollection(obj: Base): Collection<Base> | null {
    switch (obj.type) {
        case 'a':
            return getACollection(); 
        default:
            return null;
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じTまたは異なるRの値を返すジェネリック関数は、デフォルトのパラメーター値として高階関数 '(i:T)=> i'を受け入れることができません。

分類Dev

get_or_create は、フィルターで同じパラメーターをチェックすると、オブジェクトの複数の値が存在するというエラーを返し、0 個のオブジェクトを返します。

分類Dev

同じオブジェクトPHPのメソッドを数回呼び出すことはできません

分類Dev

子オブジェクトと兄弟オブジェクトで同じオブジェクト名を持つXMLシリアライザーを使用してオブジェクトをシリアル化することはできません

分類Dev

オブジェクトキーの入力を失うことなく、ジェネリックスをTypescriptメソッドに導入することはできません

分類Dev

オブジェクトをシリアル化しようとしたときの「と同じオブジェクトではありません」エラー

分類Dev

Kephasを使用するオープンジェネリックサービスでコンストラクターを使用することはできません

分類Dev

Javaジェネリックスのメソッドのクラスパラメーターに応じて文字列またはリストを返すことができますか?

分類Dev

Rでは、同じコードをパッケージのVignetteファイルに組み込むことはできません。「リスト」オブジェクトは整数型に強制変換できません

分類Dev

同じインスタンスでデリゲートメソッドを呼び出すときに、オブジェクトのインスタンスをパラメーターとして渡すことを避けますか?

分類Dev

ジェネリックのメソッドでパラメータとしてコレクションクラスを渡すことができません

分類Dev

ジェネリックオブジェクトパラメータは静的とは見なされませんが、モードオブジェクトパラメータでジェネリックを使用するにはどうすればよいですか?

分類Dev

メソッドにパラメーターを渡すことは、オブジェクトを作成することと同じですか?

分類Dev

Kotlinジェネリックアレイ<T>が、リスト<T>はしません「具体化型パラメータとしてTを使用する代わりにクラスを使用することはできません」の結果

分類Dev

なぜMockitoはKotlinに数値型とジェネリックパラメータの型を模擬することはできませんか?

分類Dev

Typescript-指定されたタイプのオブジェクトをジェネリックタイプに割り当てることはできません

分類Dev

一見同じ範囲のパラメーターとしてこのジェネリックを使用できないのはなぜですか?

分類Dev

クラスをジェネリックにせずにコンストラクターをジェネリックにすることはできますか?

分類Dev

クラスをジェネリックにせずにコンストラクターをジェネリックにすることはできますか?

分類Dev

データベースオブジェクトを返すことができません。

分類Dev

Typescriptでコンストラクターにオブジェクトを渡すことができません

分類Dev

ジャクソンを使用して、オブジェクトの値(なしdelegate-またはプロパティベースクリエイター)からデシリアライズすることはできません

分類Dev

Java:Class <?>オブジェクトをジェネリック型パラメーターと比較することは可能ですか?

分類Dev

Java:Class <?>オブジェクトをジェネリック型パラメーターと比較することは可能ですか?

分類Dev

パラメータ型制限のあるジェネリック型を非ジェネリックパラメータのメソッドに渡すことはできません

分類Dev

FluentWaitタイプはジェネリックではありません。SeleniumおよびJavaを介したFluentWaitクラスの引数<WebDriver>エラーでパラメーター化することはできません

分類Dev

ジェネリックス-関数の戻り型はパラメータ型と同じですか?

分類Dev

ジェネリックメソッドは、パラメーターとして渡すときにジェネリック型を認識しません

分類Dev

Enum型はジェネリックではありません。引数<RestClient.RequestMethod>でパラメーター化することはできません

Related 関連記事

  1. 1

    同じTまたは異なるRの値を返すジェネリック関数は、デフォルトのパラメーター値として高階関数 '(i:T)=> i'を受け入れることができません。

  2. 2

    get_or_create は、フィルターで同じパラメーターをチェックすると、オブジェクトの複数の値が存在するというエラーを返し、0 個のオブジェクトを返します。

  3. 3

    同じオブジェクトPHPのメソッドを数回呼び出すことはできません

  4. 4

    子オブジェクトと兄弟オブジェクトで同じオブジェクト名を持つXMLシリアライザーを使用してオブジェクトをシリアル化することはできません

  5. 5

    オブジェクトキーの入力を失うことなく、ジェネリックスをTypescriptメソッドに導入することはできません

  6. 6

    オブジェクトをシリアル化しようとしたときの「と同じオブジェクトではありません」エラー

  7. 7

    Kephasを使用するオープンジェネリックサービスでコンストラクターを使用することはできません

  8. 8

    Javaジェネリックスのメソッドのクラスパラメーターに応じて文字列またはリストを返すことができますか?

  9. 9

    Rでは、同じコードをパッケージのVignetteファイルに組み込むことはできません。「リスト」オブジェクトは整数型に強制変換できません

  10. 10

    同じインスタンスでデリゲートメソッドを呼び出すときに、オブジェクトのインスタンスをパラメーターとして渡すことを避けますか?

  11. 11

    ジェネリックのメソッドでパラメータとしてコレクションクラスを渡すことができません

  12. 12

    ジェネリックオブジェクトパラメータは静的とは見なされませんが、モードオブジェクトパラメータでジェネリックを使用するにはどうすればよいですか?

  13. 13

    メソッドにパラメーターを渡すことは、オブジェクトを作成することと同じですか?

  14. 14

    Kotlinジェネリックアレイ<T>が、リスト<T>はしません「具体化型パラメータとしてTを使用する代わりにクラスを使用することはできません」の結果

  15. 15

    なぜMockitoはKotlinに数値型とジェネリックパラメータの型を模擬することはできませんか?

  16. 16

    Typescript-指定されたタイプのオブジェクトをジェネリックタイプに割り当てることはできません

  17. 17

    一見同じ範囲のパラメーターとしてこのジェネリックを使用できないのはなぜですか?

  18. 18

    クラスをジェネリックにせずにコンストラクターをジェネリックにすることはできますか?

  19. 19

    クラスをジェネリックにせずにコンストラクターをジェネリックにすることはできますか?

  20. 20

    データベースオブジェクトを返すことができません。

  21. 21

    Typescriptでコンストラクターにオブジェクトを渡すことができません

  22. 22

    ジャクソンを使用して、オブジェクトの値(なしdelegate-またはプロパティベースクリエイター)からデシリアライズすることはできません

  23. 23

    Java:Class <?>オブジェクトをジェネリック型パラメーターと比較することは可能ですか?

  24. 24

    Java:Class <?>オブジェクトをジェネリック型パラメーターと比較することは可能ですか?

  25. 25

    パラメータ型制限のあるジェネリック型を非ジェネリックパラメータのメソッドに渡すことはできません

  26. 26

    FluentWaitタイプはジェネリックではありません。SeleniumおよびJavaを介したFluentWaitクラスの引数<WebDriver>エラーでパラメーター化することはできません

  27. 27

    ジェネリックス-関数の戻り型はパラメータ型と同じですか?

  28. 28

    ジェネリックメソッドは、パラメーターとして渡すときにジェネリック型を認識しません

  29. 29

    Enum型はジェネリックではありません。引数<RestClient.RequestMethod>でパラメーター化することはできません

ホットタグ

アーカイブ