【发布时间】: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";
我的问题仅与 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 行中,
<Number, String>没有将泛型参数传递给Function3。您只是为匿名函数定义类型参数。就像你写<T,U>(a:T)=>"string ret"一样。如果您能提供更多关于您正在尝试做的事情的信息,我们或许可以提供更多帮助。 -
看起来像 stackoverflow.com/questions/60178347/… 的副本,或者至少它具有相同的潜在问题(泛型函数的类型参数范围与代表函数的泛型 types 的范围。)请看看那里的问题和答案,如果您有任何未回答的问题,请告诉我。如果是这样,请将问题edit 与其他问题区分开来。
-
我认为你应该就一件事提出他的问题;要么是顶部提出的问题,要么是底部的“主要问题”。它们是两个不同的问题,有两个不同的答案。见One question per post第二个问题好像和stackoverflow.com/q/62623637/2887218重复了
标签: typescript