我最终要做的是创建一个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>>
答案 0 :(得分:1)
由于第一个函数同时具有两个类型实参,因此typescript将尝试在调用发生时推断两个,并且由于A
没有推断位点,它可能会为其推断{}
,从而使{{ 1}}永远不会。解决此问题的方法是进行B
并在第二次调用发生时推断B
,但要约束A
必须具有一个A
键:
B