我有以下对象:
interface User {
id: string;
name: string;
}
然后我有下面的对象,它代表了可以在后台为用户更新的内容:
type UpdateUserBody = Pick<User, 'name'>;
现在我想要一个函数数组,ONLY返回UpdateUserBody
的单个属性。
到目前为止我尝试过的:
[
() => user.name
] as Array<() => keyof UpdateUserBody>
问题是,如果我将() => user.id
添加到数组中,它不会抛出错误:
[
() => user.name,
() => user.id,
] as Array<() => keyof UpdateUserBody>
为什么我必须这样做
我使用Vuejs的观察者来观察这些属性,以便在当前登录的用户创建新用户时保存用户的草稿。在我的观察者中,我正在做:
const unwatchUserUpdateRequest = watch(
[
() => user.name,
] as Array<() => keyof UpdateUserBody>,
updateUserApiRequest,
)
我试过其他一些小事情,但都没有帮助我解决这个问题。
如何允许数组只具有返回UpdateUserBody
属性的函数?
这里的游乐场
如果希望user.id
不可访问,则需要修改用户类型。一个简单的方法是在不同的范围内创建函数,并将user
作为参数传递:
interface User {
id: string;
name: string;
}
type UpdateUserBody = Pick<User, 'name'>;
function getUserUpdateWatchers(user: UpdateUserBody): (() => string)[] {
return [
() => user.name,
() => user.id, // Property 'id' does not exist on type 'UpdateUserBody'.
]
}
const unwatchUserUpdateRequest = watch(
getUserUpdateWatchers(someUser),
updateUserApiRequest,
)
如果你只想提取没有进一步功能的密钥,你也可以使用一个带有通用函数的密钥列表,该函数将密钥映射到() => user[key]
函数:
const unwatchUserUpdateRequest = watch(
// Type '"id"' is not assignable to type '"name"'.
toPropertyExtractors<UpdateUserBody>(['name', 'id'], user),
updateUserApiRequest,
)
function toPropertyExtractors<T>(keys: (keyof T)[], object: T): (() => T[keyof T])[] {
return keys.map(key => () => object[key])
}