通過以下抽象,我可以呼叫此方法,并且回傳型別基于我傳遞給它的基于字串的欄位,如下所示。
abstract class Entity {
abstract id: string
}
class User extends Entity {
constructor(obj: Partial<User>) {
super()
Object.assign(this, obj)
}
id: string
name: string
age: number
}
class Post extends Entity {
constructor(obj: Partial<Post>) {
super()
Object.assign(this, obj)
}
id: string
content: string
time: Date
}
export const useSyncFields = <T extends Entity, U extends (keyof T & string)[]>(
type: { new(obj: T): T },
id: string,
fields: U,
): { [K in U[number]]: T[K] } => {
...
}
const user1: {id: string, name: string} = useSyncFields(User, "1234", ["id", "name"])
const user2: {id: string, age: number} = useSyncFields(User, "1234", ["id", "age"])
const post: {content: string} = useSyncField(Post, "4567", ["content"]
// etc
通過使用型別引數<T extends Entity, U extends (keyof T & string)[]和回傳型別{ [K in U[number]]: T[K] },從 Typescript 推斷的回傳型別“正確”,但是 VSCode 或 WebStorm 在正確推斷型別方面做得很好。
我覺得有一組更好的型別引數/回傳型別可以更好地推斷。我在這里能做的真的是最好的嗎?還是有一些型別的忍者可以指導我找到更好的解決方案?
uj5u.com熱心網友回復:
如果您只是想讓這更簡單,我會選擇:
export const useSyncFields = <T extends Entity, U extends keyof T>(
type: { new(obj: T): T },
id: string,
fields: U[],
): Pick<T, U> => {
return {} as any // implementation
}
如果您不關心型別中陣列的長度或順序,那么您不需要對整個陣列進行通用。所以這只是對fields陣列成員的通用。這意味著您不必去釣魚U[number]即可獲得密鑰的聯合。
它還采用了Pick實用型,節省您不必復雜找映射回傳型別。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407136.html
標籤:
上一篇:如何有效地為此撰寫函式?
