如何在打字稿中使用适当的类型编写省略功能

时间:2018-11-25 09:17:49

标签: reactjs typescript

我最终要做的是创建一个React HOC,它将注入由字符串定义的属性并返回一个组件,而无需注入的属性。从本质上讲,这归结为一个工厂函数,它返回一个省略函数。

在本示例中,由于某种原因您可以看到类型B最终变为“从不”。

const f = <A extends object, B extends keyof A>(arg: B) => (obj: A): Omit<A, B> => {
  delete obj[arg]
  return obj
}
// TS2345: Argument of type "test" is not assignable to parameter of type 'never'
const a = f('test')
const b = a({ test: 1})
const c = b.test

当我尝试在泛型参数之外使用keyof时,它似乎运行得更好,但是typescript无法正确推断返回类型,并且我不知道如何键入它,因为我不知道如何获取对第一个的引用可以在Omit中使用的字符串arg:

const f = <A extends object>(arg: keyof A) => (obj: A) => {
  delete obj[arg]
  return obj
}
const a = f('test')
const b = a({ test: 1 })
// Does not infer 'test' is no longer here
const c = b.test

作为参考,省略为:

export type Omit<T, K> = Pick<T, Exclude<keyof T, K>>

1 个答案:

答案 0 :(得分:1)

由于第一个函数同时具有两个类型实参,因此typescript将尝试在调用发生时推断两个,并且由于A没有推断位点,它可能会为其推断{},从而使{{ 1}}永远不会。解决此问题的方法是进行B并在第二次调用发生时推断B,但要约束A必须具有一个A键:

B