reactjs - 派生的泛型类不能分配给打字稿中的基泛型类
问题描述
我有一张存储各种元素的地图。定义如下:
const map = new Map<string, IComponent<IBase>>();
我想用这张地图来存储IComponent<IBase>
,IComponent<INumber>
等的实例IComponent<IText>
。
基本接口定义如下:
// base interface
interface IBase {}
// base component type
export type IComponent<T extends IBase> = React.FC<T>;
现在我想添加一个NumberComponent
// derived interface
interface INumber extends IBase {
someNumber: number;
}
// some component
const NumberComponent: IComponent<INumber> = (props) => {
return (
<div>{props.someNumber}</div>
);
}
我曾经map.set('number', NumberComponent)
将它存储到地图上,但我得到了
Argument of type 'FC<INumber>' is not assignable to parameter of type 'FC<IBase>'.
Types of parameters 'props' and 'props' are incompatible.
Type 'PropsWithChildren<IBase>' is not assignable to type 'PropsWithChildren<INumber>'.
Property 'someNumber' is missing in type 'PropsWithChildren<IBase>' but required in type 'INumber'.
我知道我可以用来map.set('number', NumberComponent as IComponent<IBase>)
转换类型。但是,我不想使用as
. 还有其他方法可以解决这个问题吗?
解决方案
这是可能的。你只需要超载你的Map
import React from 'react'
interface IBase { }
export type IComponent<T extends IBase> = React.FC<T>;
interface INumber extends IBase {
someNumber: number;
}
type MapOverloads = Map<string, IComponent<IBase>> & Map<string, IComponent<INumber>>
const map:MapOverloads = new Map<string, IComponent<IBase>>();
const NumberComponent: IComponent<INumber> = (props) => {
return (
<div>{props.someNumber}</div>
);
}
const BaseComponent: IComponent<IBase> = (props) => {
return null
}
map.set('number', NumberComponent)
map.set('base', BaseComponent)
主要思想被@jcalz的这个答案无耻地窃取了
但是,因为map
是可变的,并且我假设您希望它是可变的,所以getter
.
const expectNumber = map.get('number') // IComponent<IBase> | undefined
PS由于逆变,您无法分配IComponent<INumber>
给IComponent<IBase>
推荐阅读
- r - R - 在 dplyr 中使用 group_by() 和 mutate() 来应用返回向量组长度的函数
- reactjs - 什么原因?
- javascript - 密码正确时,我的 js 没有重定向
- terraform - 在与云无关的庄园中构建自定义图像(不仅仅是提取预构建的图像)
- ruby-on-rails - 如何在 Ruby on Rails 中更改数据库中的列?
- pytorch - Pytorch - 我的权重是否在这个网络中共享?
- reactjs - 如何在反应中渲染对象数组?
- python-3.x - 导入需要导出变量的模块
- vba - 如何遍历文件夹中的文件?
- reactjs - 未找到模块:导入 firebase-admin 时无法解析“http2”