我正在try 获取我为其分配了修饰符的方法的响应类型(一个老式的文字实验修饰符,而不是较新的JS修饰符).这是使用响应属性的名称作为修饰符本身的参数.

我有以下代码:

type TaskProps<T, M> = {
  next: keyof T;
  param: ReturnType<M> extends {} ? keyof ReturnType<M> : string;
};

function Task<T, K extends keyof T>(props: TaskProps<T, T[K]>) {
  return function (target: T, propertyKey: K, descriptor: PropertyDescriptor) {
  };
}

class ExampleClass {
  @Task({
    next: "bye",
    param: "name",
  })
  hello() {
    return {
      name: "example",
      age: 11
    };
  }

  bye() {}
}

当我将类型M传递给ReturnType时,它告诉我

类型‘M’不满足约束‘(...args:any)=&gt;any’.

推荐答案

在接下来的内容中,我不会真正触及decorators in TypeScript的整个主题,例如您在这里使用的文字脚本实验性修饰器和较新的JavaScript修饰器(您没有)之间的区别,或者您的修饰器函数是否真的完成了您想要的功能.我在这里只关心清除您所询问的编译器错误.


错误Type 'M' does not satisfy the constraint '(...args: any) => any'.意味着generic型参数M不是函数类型的constrained.它可能是任何东西(比如stringDate).但ReturnType utility type要求其类型参数为函数类型.因此,这里最简单的解决方法是相应地限制M:

type TaskProps<T, M extends (...args: any) => any> = {
    next: keyof T;
    param: ReturnType<M> extends {} ? keyof ReturnType<M> : string; // okay
};

然后,您会希望将该约束传播到Task,可能是这样

function Task<
    T extends Record<K, (...args: any) => any>,
    K extends keyof T
>(props: TaskProps<T, T[K]>) {
    return function (target: T, propertyKey: K, descriptor: PropertyDescriptor) {
    };
}

在这里,我们(用the Record utility type)说明T已知有一个类型为K的键,其属性值是函数类型,这让编译器得出结论,indexed access type T[K]适合作为TaskProps的第二个类型参数,从而适合作为ReturnType的类型参数.

Playground link to code

Typescript相关问答推荐

如何传递基于TypScript中可变类型的类型?

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

如何用不同的键值初始化角react 形式

如何在使用`Next—intl`和`next/link`时导航

与字符串文字模板的结果类型匹配的打字脚本

获取函数中具有动态泛型的函数的参数

访问继承接口的属性时在html中出错.角形

类型TTextKey不能用于索引类型 ;TOption

Fp-ts使用任务的最佳方法包装选项

有没有办法防止类型交集绕过联合类型限制?

NPM使用Vite Reaction应用程序运行预览有效,但我无法将其部署到Netlify

为什么在泛型方法中解析此promise 时会出现类型错误?

类型实例化过深,可能是无限的&TypeScrip中的TupleUnion错误

react 路由不响应参数

如何键入并类型的函数&S各属性

如何在具有嵌套数组的接口中允许新属性

为什么TypeScrip假定{...省略类型,缺少类型,...选取类型,添加&>}为省略类型,缺少类型?

有没有什么方法可以使用ProvideState()提供多个削减器作为根减减器

Typescript泛型验证指定了keyof的所有键

是否可以使用元组中对象的键来映射类型