我有一個函式selectProperties從一些介面中選擇鍵值,得到錯誤error TS2322: Type 'keyof T' is not assignable to type 'T'. 在升級到 typescript 4.4 之后。
typescript playground。誰有更好的主意,我怎么能走動?
export 介面 QueryActioned {
event: string;
properties:string
}
export 介面 QueryStarted {
event: number
properties: number
}
export type QueryProps = Partial< (QueryActioned & QueryStarted)['properties'] >。
const selectProperties = <T extends Partial<QueryProps>> (
鍵值。(keyof T)[]。
屬性。T
): T => {
const defaultVal: T = {}作為T。
回傳 (Object.keys(properties) as (keyof T)[])
.filter((key) => keys.includes(key))
.減少(
(acc, key) => ({
...acc,
[key]: properties[key],
}),
默認值
);
};
uj5u.com熱心網友回復:
看起來你希望 Reduce 能夠回傳一個 T 型別的物件,而它只接受一個與它所迭代的陣列值型別相匹配的默認值,并最終回傳一些值的組合。Reduce最終只會從T的鍵中回傳一個單一的值。
如果你正在選擇一些 T 型別的鍵,那么你不能將 T 作為你的回傳型別。你實際上是在基于給定的鍵的串列創建一個區域型別。
你可以通過使用forEach和突變一個回傳物件來回傳。
。
export 介面 QueryActioned {
event: string;
properties:string
}
export 介面 QueryStarted {
event: number
properties: number
}
export type QueryProps = Partial< (QueryActioned & QueryStarted)['properties'] >。
const selectProperties = <T extends Partial<QueryProps>> (
鍵值。(keyof T)[]。
屬性。T
) => {
const defaultVal: Partial<T> = {};
Object.key(properties)
.filter(key => keys.includes(key))
.forEach(key => {defaultVal[key as keyof T] = properties[key]})。
回傳defaultVal
};
如果你真的想從T上選定的鍵中獲取值,那么你可以使用map來代替。
。
export 介面 QueryActioned {
event: string;
properties:string
}
export 介面 QueryStarted {
event: number
properties: number
}
export type QueryProps = Partial< (QueryActioned & QueryStarted)['properties'] >。
const selectProperties = <T extends Partial<QueryProps>> (
鍵值。(keyof T)[]。
屬性。T
): (T[keyof T])[] => {
回傳Object.keys(properties)
.filter(key => keys.includes(key))
.map(key => properties[key])。
};
無論哪種方式,reduce都將合并keyof T陣列中的所有值,而你將你的回傳型別指定為T,這將是錯誤產生的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307924.html
標籤:
下一篇:是否可以在條件下使用$size?
