【问题标题】:How to write a function that satisfies an inline generic type?如何编写满足内联泛型类型的函数?
【发布时间】:2022-01-10 20:57:56
【问题描述】:

如何编写具有 Function3 类型的函数?

type ParamType<T> = T;
type Function3 = <T, S>(obs: ParamType<T>) => ParamType<S>;
const ofunc3: Function3 = <Number, String>(a: Number) => "string ret"; // error

但是这个例子是有效的:

type Function2<T, S> = (obj: ParamType<T>) => ParamType<S>;
const ofunc2: Function2<number, string> = (a: number) => "string ret";

Playground link

我的问题仅与 TS 语法有关。 在此链接中,我尝试以两种方式编写 TS 方法装饰器:一种是工作,另一种是使用 MethodDecorator 类型。

LINK to TS playground - method decorator

主要问题 - MethodDecorator 不是通用方法,然后我尝试使用它:

function Method2(): MethodDecorator {
  return <FuncType,>(target: Object, propertyKey: string | symbol, propertyDescriptor: TypedPropertyDescriptor<FuncType>) => {
    propertyDescriptor.value =func1
  };
}

我看到错误:“类型 'FuncType' 不可分配给类型 'FuncType'。存在具有此名称的两种不同类型,但它们不相关。”

【问题讨论】:

  • 您的 Function3 类型似乎不太明智 - 您向调用者保证,无论他们指定的两种类型,他们都可以调用您的函数,传入第一种类型的东西,并接收一些(可能完全不相关的)第二种类型 - 甚至没有函数知道由于类型擦除而指定了哪些类型。你确定这是你真正想要的吗?
  • 我同意,这个例子是人为的,我只是想理解 TS 语法。例如 - 标准 TS 类型具有 MethodDecorator 和内部类型:“descriptor: TypedPropertyDescriptor”,我无法理解如何编写 descriptor.value = ()=>{}
  • 请注意,在您的第一个示例的第 3 行中,&lt;Number, String&gt; 没有将泛型参数传递给Function3。您只是为匿名函数定义类型参数。就像你写&lt;T,U&gt;(a:T)=&gt;"string ret"一样。如果您能提供更多关于您正在尝试做的事情的信息,我们或许可以提供更多帮助。
  • 看起来像 stackoverflow.com/questions/60178347/… 的副本,或者至少它具有相同的潜在问题(泛型函数的类型参数范围与代表函数的泛型 types 的范围。)请看看那里的问题和答案,如果您有任何未回答的问题,请告诉我。如果是这样,请将问题edit 与其他问题区分开来。
  • 我认为你应该就一件事提出他的问题;要么是顶部提出的问题,要么是底部的“主要问题”。它们是两个不同的问题,有两个不同的答案。见One question per post第二个问题好像和stackoverflow.com/q/62623637/2887218重复了

标签: typescript


【解决方案1】:

您可以转换返回值以使其工作,例如和字符串一样未知

const ofunc3: Function3 = <Number, String>(a: Number) => "string ret" as unknown as String;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-13
    • 2014-10-08
    • 1970-01-01
    • 2016-03-21
    • 2016-10-04
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多