簡體   English   中英

是否可以在 typescript 中約束推斷的 generics?

[英]Is it possible to contrain inferred generics in typescript?

舉個例子:

type A<Keys extends string, Prefix extends string> = 
  {[K in Keys]: `${Prefix}-${K}`}

function noGood<K extends string, Prefix extends string>(
  obj: A<K, Prefix>, prefix: Prefix
) {
// ...
}

const test: A<'one' | 'two', 'prefix'> = {"one": 'prefix-one', "two": 'prefix-two'}

noGood(test, 'desired to only be "prefix", but can be any string...')

您可以看到 noGood 的泛型類型是從第一個參數 ( obj ) 推斷出來的。 然后,當您向第二個參數( prefix )提供一個字符串時

顯然,您可以輸入對noGood的調用,它會禁止第二個參數使用該隨機字符串,但理想情況下您不必這樣做。

編輯:問題不明確。

澄清一下,問題是當您將 arguments 推斷為noGood時, Prefix推斷無法按預期工作(但不一定是意外的),因為將Prefix限制為obj的通用Prefix (第一個參數)是理想的.

在這個例子中, Prefix (generic) 字面意思是'prefix' ,並且希望只允許它用於推斷的noGood第二個參數。 但是,當您調用noGood(obj, 'diff-prefix')時, Prefix泛型變為'prefix' | 'diff-prefix' 'prefix' | 'diff-prefix' ,理想情況下,它將被限制為從obj推斷的類型,而不是從第一個和第二個參數的聯合推斷的類型。

希望這能說明問題。 絕對可以看出它是如何不清楚的。

@HelloWorld 根據你對我的其他答案的評論,如果你希望參數prefix僅是 object 的其中一個鍵的值,那么通過一些調整仍然相對容易:

const foo = {"one": 'prefix-one' as const, "two": 'prefix-two' as const}

function noGood<O extends {}>(
  obj: O, prefix: O[keyof O]
) {
// ...
}

noGood(foo, 'prefix-one'); // sure ok
noGood(foo, 'crabapple'); // error!

請注意在定義foo內部的值時使用as const 這很重要,因為它告訴 TypeScript 這些值不會改變,可以被視為常量、顯式類型,而不僅僅是任何舊string 否則, noGood(foo, 'crabapple')不會給出錯誤,因為 TypeScript 通常會將foo的每個鍵的值推斷為string而不是"prefix-one" | "prefix-two" "prefix-one" | "prefix-two"

如果這仍然不符合您的用例,請使用更具體的詳細信息和要求更新您的問題。

如果您不太關心約束“ noGood() ”的 object 參數,這在基本級別上是微不足道的。 使用 generics 強制參數prefix是 object 參數obj的鍵(“前綴”一詞在這里似乎用詞不當,因為您似乎只關心obj的鍵,但我離題了):

function noGood<O extends{}>(
  obj: O, prefix: keyof O
) {
// ...
}

我並沒有真正知道從類型A中提取“ Prefix ”的類型信息的方法,因為在實例化后 object 不保留該通用類型信息 - 沒有辦法強制執行 object作為obj傳入的絕對是您的類型A的一個實例。

暫無
暫無

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

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