假設有一個超型別A:
type A = {
q: {
x1: string;
x2: number;
};
p: number;
};
const aObj: A = {
q: {
x1: 'jj',
x2: 3,
},
p: 5,
};
const fn = <T extends string & keyof A>(path: keyof A): Pick<A, T> => {
return aObj[path];
};
const fn2 = <T extends string & keyof A>(path: keyof A): A[T] => {
return aObj[path];
};
上面的代碼引發了以下錯誤 TS 2322:
Type "number | { x1: string; x2: number; }" is not assignable to type "A[T]".
Type "number" is not assignable to type "A[T]".
Type "number" is not assignable to type "{ x1: string; x2: number; } & number".
Type "number" is not assignable to type "{ x1: string; x2: number; }".
現在,我想撰寫一個泛型函式fn,它回傳所選擇的屬性的型別Pick<A, "p" | "q">,即(number) | ({ x1: string, x2: number })取決于指定的泛型引數。
但是,Pick僅回傳 的所有選取屬性的子集A。
用方括號替換Pick似乎也不起作用。
獲取所選屬性的型別而不僅僅是子集的正確方法是什么?
uj5u.com熱心網友回復:
你可以有類似的東西:
const fn2 = <T extends keyof A>(path: T): A[T] => {
return aObj[path];
};
你可以在TypeScript 游樂場檢查這個
根據您的代碼庫,因為 T 和 typeof 路徑(即 keyof A)之間沒有關聯。TypeScript 無法確定回傳型別應該是什么。即對于路徑p,它應該是number還是應該是{ x1: string, x2: number }。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/450792.html
標籤:打字稿
