[英]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.