reactjs - 基于用户提供的配置为我的 React 组件(一个 NPM 包)派生类型?
问题描述
我正在尝试制作一个<Box>
可以在所有项目中使用的组件。这就是我想要发生的事情:
import { Box, BoxConfigProvider } from 'my-npm-package';
const myConfig = {
coreColors: {
'pink': '#e38e8e'
}
}
...
const App = () => {
return (
<BoxConfigProvider config={myConfig}>
<Box color="pink--100">
I'm pink.
</Box>
</BoxConfigProvider>
);
}
color
我想要道具的自动完成建议。我的组件采用提供的coreColors
并自动生成${colorName}--100
通过${colorName}--700
(色调和阴影)命名的颜色调色板。
这可行吗?!现在我Box
有自己的带有固定颜色的捆绑配置,一切正常,因为我的类型是从keyof typeof BUNDLED_CONFIG.coreColors
(例如)派生的,但我希望能够根据我使用它的项目“注入”我自己的颜色。 .
我也只是假设我需要某种 Context / Provider 设置,但我很想避免它。现在我的包有自己config.ts
的定义颜色名称、字体大小名称等——我基本上想做同样的事情,但是从包外部获取对象。即使他们从内部提供它package.json
——只要我能从中派生出类型!
希望这主要是连贯的。也许我把事情复杂化了??
解决方案
从 TS 4.1 开始,您可以使用密钥重新映射来完成您的想法:
const colors = {
pink: '',
red: '',
};
type BaseColor = keyof typeof colors;
// "pink" | "red"
type Colors = keyof {
[C in BaseColor as `${C}-100` | `${C}-200`]: string;
};
// "pink-100" | "pink-200" | "red-100" | "red-200"
重要的一点是Colors
类型,它期望BaseColor
类型是你有色调的所有颜色名称的联合。
至于将它连接到您的BoxConfigProvider
组件中,我不确定 TS 是否真的支持它。至少不是直接的。
推荐阅读
- java - 如何从命令行打开的 Java 代码关闭 CMD 窗口?
- list - 在 Haskell 中传递两个列表作为参数
- python - 在 count_values pandas 分类数据中包含零
- c++ - 无论如何要消除构造函数选择的歧义?
- java - Intellij IDEA 和 Spring 依赖注入
- php - 选择laravel后如何存储select2远程ajax数据
- reactjs - 如何在回调中调用 useSelector
- java - spring boot restful应用程序中如何响应pbf文件?
- reactjs - 使用 react-apollo useMutation hook 处理错误
- android - 如何在 Android 10、Target API 29 中从设备的共享存储(根目录)读取现有文件?