我有以下代码:
type SuperType<T = any> = {
entities?: {
[key: string]: T
};
}
class Test<T> {
value: T;
constructor(v: T) {
this.value = v;
}
update(cb: (v: T) => T) {
this.value = cb(this.value);
}
}
interface H extends SuperType<{ prop: number }> {}
const instance = new Test<H>({});
我想创建一个更新值的高阶函数:
function updateSomething<
T extends SuperType,
E = T extends SuperType<infer I> ? I : never>(arg: E) {
return function (value: T) {
return value;
}
}
如何推断高阶函数中的泛型?
instance.update(updateSomething(placeholder))
所以这里placeholder
应该输入为{ prop: number }
我根本看不到SuperType
涉及到什么,因为H
不能分配给SuperType
。我现在暂时忽略SuperType
,您可以告诉我是否需要更改您的问题才能使用它。
我的打字倾向updateProp()
如下:
function updateProp<K extends PropertyKey>(prop: K) {
return function <T extends Record<K, any>>(value: T) {
return value;
}
}
在这里我说的K
是允许它是任何类似键的东西,然后返回的函数将接受任何值K
作为键并返回相同类型的东西。与instance.update()
以下对象一起使用时具有预期的效果:
instance.update(updateProp('name')); // okay
instance.update(updateProp('id')); // okay
instance.update(updateProp('notExists')); // error, as desired
那对你有用吗?希望能有所帮助;祝好运!
对于修改后的示例,我更改了类型,但保留了相同的基本思想:您需要updateProp()
对其参数的类型进行泛型,然后从中计算出其他类型:
function updateProp<E>(prop: E) {
return function <T extends SuperType<E>>(value: T) {
return value;
}
}
instance.update(updateProp({ prop: 123 })); // okay
instance.update(updateProp({ prop: "" })); // error
instance.update(updateProp({ prop: 123, unexpectedProp: 456 })); // error
希望能再次有所帮助;祝好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句