Generics React组件上的推断泛型类型
Typescript在推断泛型类型方面非常好。例如,如果我编写以下代码: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
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); }} />;