Typescript TSX和泛型参数

sha*_*are 16 generics jsx typescript

Typescript引入了对JSX语法的支持.所以我的表达式与传统的*.ts文件非常相似,但没有*.tsx文件:

const f = <T1>(arg1: T1) => <T2>(arg2: T2) => {
   return { arg1, arg2 };
}
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法让它在*.tsx文件中运行?

Dav*_*ret 18

您可以使用函数表达式:

const f = function<T1>(arg1: T1) {
    return function<T2>(arg2: T2) {
        return { arg1, arg2 };
    };
};
Run Code Online (Sandbox Code Playgroud)

或者,我发现这是有效的:

const f = <T1, T2>(arg1: T1) => (arg2: T2) => {
   return { arg1, arg2 };
};
Run Code Online (Sandbox Code Playgroud)

在旁注中,似乎在提供多个通用参数时它将编译良好,但不是一个.例如,提供虚拟通用参数将使此工作:

const f = <T1, _>(arg1: T1) => {
   return { arg1 };
};

// or just adding a comma
const g = <T1,>(arg1: T1) => {
   return { arg1 };
};
Run Code Online (Sandbox Code Playgroud)

但这绝对不是理想的.可能有另一种方法只使用一个通用参数来完成这项工作,但我不确定.


Dan*_*ser 18

这是解析歧义问题的结果.使这个明确无误的一件事是添加一个明确的约束T1.

const f = <T1 extends unknown>(arg1: T1) => {
    return { arg1 };
}
Run Code Online (Sandbox Code Playgroud)

无论如何,类型参数T1隐式地具有约束unknown,因此在这种情况下,您的代码在功能上是等效的.

采用此解决方案,您可以应用原始示例中的每个箭头功能.

  • 不幸的是,现在 Eslint 报告错误 Constraining the generic type `STATE` to `unknown` 不执行任何操作,并且是不必要的 @typescript-eslint/no-unnecessary-type-constraint (4认同)
  • 我在团队中工作,不应该。正如我在上面解释的那样,没有约束的泛型获得了一个隐式约束“ {}”,并且在大多数情况下在功能上是等效的。 (2认同)
  • 在TypeScript 3.0中,您可以使用`extends unknown`,我认为应该可以。 (2认同)