Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics React组件上的推断泛型类型_Generics_Reactjs_Typescript_Jsx_Inferred Type - Fatal编程技术网

Generics React组件上的推断泛型类型

Generics React组件上的推断泛型类型,generics,reactjs,typescript,jsx,inferred-type,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.get

Typescript在推断泛型类型方面非常好。例如,如果我编写以下代码:

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

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

const inst = new AwesomeClass("Hello World");
const result = inst.getVal();
我真的希望能够推断出
value
必须具有与
onClick
result
参数相同的类型。相反,当我用

<AwesomeComponent
    value="Hello World"
    onClick={(v) => { console.log(v); }} />;
{console.log(v);}}/>;
我得到一个编译错误
错误TS2322:类型“string”不能分配给类型“T”

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


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

这还不可能,这里有一个问题:

现在,您需要做的是:

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); }} />;
接口IProps{
值:T;
onClick:(结果:T)=>void;
}
界面IState{}
类AwesomeComponent扩展了React.Component{
// ...
}
类ConcreteAwesomeComponent扩展了AwesomeComponent{}
{console.log(v);}}/>;

是否可以声明
ConcreteAwesomeComponent
键入
JSDoc@type
注释?@Hassan我想是的,我从未使用过JSDoc,所以我不确定。但为什么不可能呢?
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); }} />;