我有一個包含一些條件的型別(注意這不是我的實際代碼,而是一個精簡的版本,試圖用最少的代碼來突出這個問題)
type A<T> = {
prop: T。
value:
T extends string ? { a: T, b: T } ? :
T extends number ? { y: T, z: T } ? :
從來沒有
}
用這種型別的變數實體化作業很好。 例如:
// works
const a_string: A<string> = {
prop: ''。
value: { a: ''/span>, b: ''}。
}
//works
const a_number: A<number> = {
prop: 0,
value: { y: 1, z: 1}。
}
//錯誤(如預期)。
const a_mistake: A<數>= {
prop: 0,
value: { a: ''/span>, b: '' } <-- Should be { y:數字, z: 數字 }
}
我的問題在于,當我試圖創建這個函式時:
我的問題是
function myFunc<T extends string> (prop: T): A<T> {
return {
prop,
value: { a: prop, b: prop }
}
}
我不明白為什么這不起作用。 Typescript抱怨說我回傳的東西不能分配給A:
。Type '{ a: T; b: T; }'不能分配給型別'T extends string ? { a: T; b: T; } : T extends number ? { y: T; z: T; } : never'.ts(2322)
union.ts(33, 3) 。預期的型別來自從屬性'value',在這里宣告的型別是'A<T> '。
對于我的生活,我無法理解為什么?
uj5u.com熱心網友回復:
我不知道為什么這不起作用,但由于某些原因,typescript不能推斷出正確的值屬性型別。你可以通過使用型別斷言來解決這個問題,因為你知道prop擴展了string:
function myFunc<T extends string> (prop: T) {
return {
托普。
value: { a: prop, b: prop },
} as A<T> 。
uj5u.com熱心網友回復:
我做得有點過分了。
你所需要做的就是將你的功能過度化。
你需要做的就是將你的功能過度化。
type A<T> = {
prop: T。
value:
T extends string ? { a: T, b: T } ? :
T extends number ? { y: T, z: T } ? :
從來沒有
}
function myFunc<Prop extends string | number> (prop: Prop)。) A<Prop>
function myFunc<Prop extends string | number>(prop: Prop) {
return {
prop,
value: { a: prop, b: prop }
}
}
const result = myFunc('sdf') 。 value.a // ok。
const result2 = myFunc(42)。 value.y // ok。
我假設你在這個函式中有很多switch案例,否則你甚至不需要一個通用引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318415.html
標籤:
下一篇:R:所有樣本都一樣
