【问题标题】:Inferred Generic Type on React Component在 React 组件上推断通用类型
【发布时间】:2017-04-15 04:34:47
【问题描述】:

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 示例中那样直接初始化类)并且这可能会使过程复杂化 - 这是一个交易杀手吗?如果是这样,我可以使用 JSX 语法显式命名泛型类型吗?

【问题讨论】:

    标签: generics reactjs typescript jsx inferred-type


    【解决方案1】:

    这还不可能,这里有个问题: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); }} />;
    

    【讨论】:

    • 是否可以声明ConcreteAwesomeComponent 输入JSDoc @type评论?
    • @Hassan 我想是的,我从未使用过 JSDoc,所以我不确定。但为什么不可能呢?
    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 2018-01-13
    • 2021-11-19
    • 2022-01-26
    • 2021-07-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多