仅从对象返回键的函数数组的类型



我有以下对象:

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])
}

最新更新