我試圖想出一種型別,即接受一個物件并將所有型別為number的鍵設定為string。 下面的方法不起作用:
export type ChangeTypeOfKeys< T extends object> = {
[key in keyof T]: key extends number ? string : T[key]
}
const c: ChangeTypeOfKeys<{ a: number, b: boolean }> ={
a: 'ok',
b: false。
結果型別應該是{ a: string, b: boolean },但我得到一個TS錯誤:
Type 'string' is not assignable to type'number'. (2322)
input.tsx(5, 29) 。預期的型別來自從屬性'a',在這里宣告的型別是'ChangeTypeOfKeys<{ a: number; b: boolean; }> '
我認為這個問題與我在key中使用key in keyof T的方式有關,因為用另一個引數替換key extends number可以作業:
export type ChangeTypeOfKeys< T extends object, Replace> ={
[key in keyof T] 。Replace extends number ? string : T[key]
}
const c: ChangeTypeOfKeys<{ a: number, b: boolean }, number> ={
a: 'ok',
b: 'ok',
}
不確定是否有任何與key有關的特殊屬性,我在這里錯過了。 TIA!
uj5u.com熱心網友回復:
要獲得由key參考的屬性的值,請這樣做:
export type ChangeTypeOfKeys< T extends object> = {
[key in keyof T] 。T[key] extends number ? string : T[key] ?
//^^^^^^ ?
}
在你給出的例子中,key的型別將總是string。為了明確起見,在你的代碼中:
在你的代碼中
key指的是一個屬性的名稱,T[key]指的是型別T上名為key的屬性 。
還要注意,
標籤:extends object允許[]型別(包括其他),這可能不是你想要的。試著從{}或Record<string, any>來擴展。
