Typescript推断高阶函数中内部函数的类型

未定义

我有以下代码:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章