簡體   English   中英

Typescript 類型參數未按預期從泛型 class 中推斷出來

[英]Typescript type parameter not inferred from generic class as expected

在此示例中,我使用參數類型(keyof TFoo)[]來期望包含TFoo中的任何鍵的數組,以保持示例簡單,但我在任何時候都看到類型參數推斷的相同行為使用模式<T, TSomeClass extends SomeClass<T>> 它似乎正確地推斷出TFoo類型,因為它適用於第一個fooBarBad function 參數bar的 class ,因此在此示例中它將TBar標識為Bar<{ a: number, b: number }> ,但對於第二個參數fooKeys ,它推斷TFoo{ a: any, c: any } ,它是從數組中傳遞的值中獲取的。 我可以看到它可能試圖以任何一種方式推斷TFoo ,但我至少希望它對兩個 function 參數應用相同的TFoo推斷值,因為它們都引用相同類型的參數TFoo

class Bar<TFoo> {
  constructor(foo: TFoo) {}
}

function fooBarBad<TFoo, TBar extends Bar<TFoo>>(bar: TBar, fooKeys: (keyof TFoo)[]) {}

// No error, but I expect one - fooKeys is instead inferred to be ('a' | 'c')[]
fooBarBad(new Bar({ a: 1, b: 2 }), ['a', 'c']);

在此處輸入圖像描述

有沒有其他方法可以聲明這個以獲得我想要的推論? 或者有什么技巧可以強迫它?

一個更簡單的例子推斷出我所期望的。

function fooBar<TFoo>(foo: TFoo, fooKeys: (keyof TFoo)[]) {}

// Error as expected - 'c' is not a key of TFoo
fooBar({ a: 1, b: 2 }, ['a', 'c']);

簡單案例按預期推斷

TypeScript在尋找推理目標時優先考慮arguments。 TBar的類型由第一個參數推斷,而TFoo由第二個參數推斷,而不是通過TFoo的約束。

我們可以將您的示例簡化為具有單個通用參數TFoo

class Bar<TFoo> {
  constructor(foo: TFoo) {}
}

function fooBarBad<TFoo>(bar: Bar<TFoo>, fooKeys: (keyof TFoo)[]) {}

這導致了正確的推理。

fooBarBad(
  new Bar({ a: 1, b: 2 }), ['a', 'c']
//                               ~~~ Type '"c"' is not assignable
//                                   to type '"a" | "b"'
)

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM