function pick<T, K extends keyof T> (obj: T, keys: K[]): Pick<T, K> {
return keys.reduce((result, key) => {
result[key] = obj[key]
return result
}, {} as any)
}
const keys = ['b', 'c']
const o = {a: 1, b: '2', c: 3}
const picked = pick(o, ['b', 'c']) // ok
const picked2 = pick(o, keys) // error
类型'string []'的参数不能分配给类型'(“ a” |“ b” |“ c”)[]'的参数。
我只想动态选择键,怎么办
答案 0 :(得分:0)
keys
被创建为string[]
,但是当您使用Pick
时,它会创建字符串文字类型。您可以使用o
的类型并使用keyof
的类型来解决此问题。只需很少的更改即可编写该代码的方法是:
const o = {a: 1, b: '2', c: 3}
const keys: (keyof typeof o)[] = ['b', 'c']
如果您尝试执行const keys: (keyof typeof o)[] = ['b', 'd']
,仍然会收到错误消息,因此仍然可以确保类型安全。
我建议为o
创建一个类型,并使用它,例如
interface O {
a: number;
b: string;
c: number;
}
const keys: (keyof O)[] = ['b', 'c']