typescript - 为什么 makeStyles 和 createStyles 必须分开(Material UI + TypeScript)?

标签 typescript material-ui

我一直在使用 Material UI 处理 TypeScript 问题所需的这种结构,这真的让我很烦恼,每次我想为组件设置样式时,我都需要记住如何将 2 个不同的函数组合成会产生钩子(Hook)的东西(我可以用一个片段来解决它,但这对我来说从来都不是正确的):

const useStyles = makeStyles((theme: Theme) =>
  createStyles({
    ...styles
  })
);
因此,我当然尝试通过将其抽象为 1 个函数来使其更加干燥,但我似乎无法理解如何使这些类型为此工作。这是我笨拙的尝试:
const makeUseStyles = (styleFunc: (th: Theme) => CSSProperties | CreateCSSProperties<{}>) =>
  makeStyles((theme: Theme) => {
    const st = styleFunc(theme);
    return createStyles(st);
  });
这会产生 2 个问题:createStyles不接受 st作为论据:
Type 'unknown' is not assignable to type 'PropsFunc<(value: JSSFontface, index: number, array: JSSFontface[]) => unknown, CreateCSSProperties<(value: JSSFontface, index: number, array: JSSFontface[]) => unknown>>'
以及 makeUseStyles 返回的函数突然期待一个必需的参数props类型 (value: JSSFontface, index: number, array: JSSFontface[]) => unknown .
所以我假设,因为我的尝试失败了,这就是为什么首先需要 2 个单独的函数来安抚 TypeScript,但是编译器会决定抽象让我很困扰(感觉就像它一直在做那一刻我试着把我的样式代码弄干一点)。所以我的问题是:为什么?

最佳答案

当您使用或升级到 TypeScript 版本 > 3.4 时,您不需要调用 createStyle。 const assertions在此版本中可用的内容可以击败类型扩大。根据a code comment , 函数 createStyles将在 MaterialUI v5 中删除(尽管尚未从 v5.0.0-alpha.23 中删除)。
我确实没有遇到任何类型扩大,eps1lon 也证实了这一点。在 github issue comment .文档绝对应该更新。

关于typescript - 为什么 makeStyles 和 createStyles 必须分开(Material UI + TypeScript)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65409117/

相关文章:

javascript - 尝试调用方法时 ViewChild 组件未定义

angular - 如何在 Angular 6 中将相对导入转换为绝对导入?

javascript - Typescript 生成的 JavaScript 有一个不是函数的函数

reactjs - 在 Material UI beta 中使用 CardContent 组件时出现错误

css - 设置TextField高度material-ui

Angular CLI 停止在浏览器控制台中给我合理的行(没有源映射),但终端显示正确的源

angularjs - WebPack 中的 Typescript(加载程序)编译器错误

html - 为什么屏幕上看不见的元素在打印时会部分出现?

javascript - 循环内的 onChange 事件仅传递第 0 个索引

reactjs - 如何覆盖 Material-UI Popover 样式?