通过以下抽象,我可以呼叫此方法,并且回传型别基于我传递给它的基于字符串的栏位,如下所示。
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
实用型,节省您不必复杂找映射回传型别。
操场
0 评论