generics - React 组件的推断通用类型

标签 generics reactjs typescript jsx inferred-type

Typescript 非常擅长推断泛型类型。例如,如果我编写以下代码:

class AwesomeClass<T> {
    constructor(public val: T) {
        // ...
    }

    public getVal(): T {
        return this.val;
    }
}

const inst = new AwesomeClass("Hello World");
const result = inst.getVal();

result 自动输入为 string。漂亮!我想通过 React 更进一步。

如果我制作跟随组件

interface IProps<T> {
    value: T;
    onClick: (result: T) => void;
}
interface IState { }

class AwesomeComponent<T> extends React.Component<IProps<T>, IState> {
    // ...
}

我真的很想推断 value 必须与 onClickresult 参数具有相同的类型。相反,当我用

初始化组件时
<AwesomeComponent
    value="Hello World"
    onClick={(v) => { console.log(v); }} />;

我收到编译错误 error TS2322: Type 'string' is not assignable to type 'T'

是否可以推断 React 元素的 props 的泛型类型?

我意识到 JSX 转换为对 React.createElement 的调用(它不像我在上面的 AwesomeClass 示例中那样直接初始化类)并且这可能会使流程复杂化——这是交易 killer 吗?如果是这样,我可以使用 JSX 语法显式命名泛型类型吗?

最佳答案

这还不可能,这里有一个问题:Using lookahead to detect generic JSX elements? .

现在你需要做的是:

interface IProps<T> {
    value: T;
    onClick: (result: T) => void;
}
interface IState { }

class AwesomeComponent<T> extends React.Component<IProps<T>, IState> {
    // ...
}

class ConcreteAwesomeComponent extends AwesomeComponent<string> {}

<ConcreteAwesomeComponent
    value="Hello World"
    onClick={(v) => { console.log(v); }} />;

关于generics - React 组件的推断通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895388/

相关文章:

java - 将带有泛型的迭代器转换为带有通配符的迭代器

java - Generic 中的类型转换错误

java - JavaFX 中的 ChangeListener : how can I make these generics parameters less ugly?

javascript - React Hook useEffect 在添加缺少的依赖项时进入无限循环

javascript - typescript -我在使用函数的返回值时遇到问题

Java 泛型 T 与对象

javascript - React 期望一个赋值或函数调用,但看到一个表达式

javascript - 构建多页面 React 应用程序

Typescript 对类型参数类的泛型约束

typescript - 升级到 TS 0.9 后我得到 TS5007 : Cannot resolve referenced file:, 我该如何解决这个问题?