Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Typescript 如何键入“多态”组件?_Typescript - Fatal编程技术网

Typescript 如何键入“多态”组件?

Typescript 如何键入“多态”组件?,typescript,Typescript,我试图键入一个React组件,它可以包装一个数字或数字[]的值,但不能同时包装这两个值。这是迄今为止我得到的声明的一个人为版本: export interface Props<T> { value: T; } class SomeComponent<T extends number | number[]> extends React.Component<Props<T>, any> { getValue(): T; } 我的问题是我不知

我试图键入一个React组件,它可以包装一个数字或数字[]的值,但不能同时包装这两个值。这是迄今为止我得到的声明的一个人为版本:

export interface Props<T> {
  value: T;
}

class SomeComponent<T extends number | number[]> extends React.Component<Props<T>, any> {
  getValue(): T;
}
我的问题是我不知道。如果声明正确,则为2。我怎么能用它。我现在正在尝试/想做类似的事情,但这是一个语法错误:

const foo: number = 123;
return <SomeComponent<number> value={foo} />

如何声明和使用这样工作的组件?

问题是不能在tsx标记中使用泛型。您可以使用常规TS语法实例化组件:

var cNumber = new SomeComponent<number>({
    value : 0 
});
var cNumberArray = new SomeComponent<number[]>({
    value: [1, 2, 3]
});
另一个选项是声明修复类型参数的额外类型:

let SomeNumberComponent: new ()=> SomeComponent<number> =  SomeComponent as any;

注:还强调了这一限制

class SomeIntComponent extends SomeComponent<number> {

}