typescript:类型'string []'的参数不能分配给类型'(“ a” |“ b” |“ c”)[]'的参数

时间:2018-06-20 15:48:14

标签: typescript

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”)[]'的参数。

我只想动态选择键,怎么办

1 个答案:

答案 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']