typescript - Typescript 错误:扩展推断类型可防止 TS Linting 错误(提供 Playground 示例)
问题描述
我有一个名为 的函数myStyles
,它接受一个参数。这个参数是一个包含一个baseStyles
对象和一个对象的styleVariants
对象。它只是返回styleVariants
对象。
function myStyles<StyleVariants extends StyleVariantsStructure>(params: {
baseStyles: AllowedStyles;
styleVariants: StyleVariants;
}): StyleVariants {
return params.styleVariants;
}
它是这样调用的:
myStyles({
baseStyles: {
color: 'red',
backgroundColor: 'red',
},
styleVariants: {
color: {
red: {
color: 'red',
backgroundColor: 'red',
},
},
},
});
该baseStyles
对象具有 type AllowedStyles
,它确定我们允许哪些 css 属性和值。这非常有效,如果调用函数时 CSS 属性或值拼写错误,我们会得到正确的 TS 错误,myStyles
例如
type AllowedStyles = {
color?: 'red';
backgroundColor?: 'red';
};
该styleVariants
对象具有类型StyleVariantsStructure
。这实质上决定了它应该接受一个或多个包含AllowedStyles
例如的嵌套对象
type StyleVariantsStructure = {
[k: string]: {
[k: string]: AllowedStyles;
};
};
在函数中,我们对param 对象myStyles
使用类型推断。styleVariants
这意味着,我们会自动获取styleVariants
传入myStyles
函数的确切类型。然后我们使用该styleVariants
类型作为函数的返回类型。这对我们来说是必需的,因为我们需要知道myStyles
. 这是我们的函数:
function myStyles<StyleVariants extends StyleVariantsStructure>(params: {
baseStyles: AllowedStyles;
styleVariants: StyleVariants;
}): StyleVariants {
return params.styleVariants;
}
这是类型推断返回类型的示例,取自我用来演示此问题的 Typescript 游乐场:
问题
正如你所看到的,我需要限制在styleVariants
对象中传递的东西,使用StyleVariantsStructure
我们必须只接受的类型AllowedStyles
。但是,我们还需要将推断类型 fromstyleVariants
用于函数的返回类型myStyles
。我试图通过使用来解决这个问题StyleVariants extends StyleVariantsStructure
。这有点工作,但styleVariants
在调用myStyles
.
例如,如果color
拼写错误,我们不会收到 TS 错误:
但是,我确实得到了类型建议:
而且,如果值拼写错误,我会收到错误:
本质上,对我来说,似乎我需要找到一种替代方法来对styleVariants
对象使用类型推断,同时还要使用类型来限制它StyleVariantsStructure
。对此的任何帮助将不胜感激。
解决方案
严格来说,这看起来是正确的,但需要哄TS检查它。例如,使用 console.log() 在 Playground 中包装调用会生成您想要的类型检查。
TS 作为检查器是不完美的,因此它可能需要一些技巧才能在高度复杂的情况下检测到“正确”的解决方案——就是这样!
推荐阅读
- postgresql - apache ignite 或任何其他用于 postgres 的内存缓存
- node.js - 将 ElephantSQL 与 node.js 连接
- python-3.x - 遵循 IG 抓取教程并停留在 XPath/其他问题上
- angular - 将 HTML 传递到 Mat 对话框
- android - 来自 instagram 克隆 android 应用程序的数据未反映在 Firebase 中的实时数据库中
- build - 从 Azure DevOps 构建可视化代码指标的选项有哪些?
- azure - 是否可以在日志分析中查询 Azure 数据仓库
- xcodebuild - iOS 14,为设备和模拟器创建库时出现 lipo 错误
- bash - 如何从 shell 脚本中的 .csv 文件的列中读取多个值
- javascript - 更新数据时无法在 deck.gl 中调用 set Props