为啥 sx 道具类型检查失败?

Posted

技术标签:

【中文标题】为啥 sx 道具类型检查失败?【英文标题】:Why does sx prop typecheck fail?为什么 sx 道具类型检查失败? 【发布时间】:2021-10-24 05:18:50 【问题描述】:

我正在尝试在 React 应用中使用基于 sx prop 的样式。°

我想通过所谓的theme getter 访问主题。

当我尝试使用这种方法时,我可以看到样式在浏览器中呈现正常。然而 TypeScript 抱怨,我发现理解类型血统并弄清楚它在说什么具有挑战性。

Working沙盒

Not working沙盒

完全错误:

No overload matches this call.
  Overload 2 of 2, '(props: DefaultComponentProps<BoxTypeMap<, "div">>): Element', gave the following error.
    Type 'string' is not assignable to type 'SystemStyleObject<Theme>'.
  Overload 2 of 2, '(props: DefaultComponentProps<BoxTypeMap<, "div">>): Element', gave the following error.
    Type '(theme: any) =>  border: string; ' is not assignable to type 'SystemStyleObject<Theme>'.
      Type '(theme: any) =>  border: string; ' is not assignable to type 'CSSSelectorObject<Theme>'.ts(2769)
app.tsx(8, 22): Did you mean to call this expression?

可能相关的 GH 讨论 1, 2

大概我应该通过显式设置SystemStyleObject,但不确定从哪里导入它。任何指针将不胜感激。

° 应用使用 TypeScript 4.4.1-rc + MUI 5.0.0-beta.4

【问题讨论】:

【参考方案1】:

它的输入方式。主题功能只能应用于 CSS 样式,不能应用于类。您可以像这样将其向下移动到边框:

  <Box
    sx=
      border: "1px solid red",
      ".some-child": 
        border: (theme) => 
          return "1px solid green";
        
      
    
  >

【讨论】:

谢谢!我也尝试过,但不确定如何在密钥中需要 theme 的情况下使用它,例如断点 - 见codesandbox.io/s/… 有什么方法可以扩展类型以允许在我自己的类中使用主题功能?这是个坏主意吗?这个文档部分让我想知道它是否可行next.material-ui.com/customization/theming/#custom-variables @paws 这是我自己遇到的问题,暂时不支持github.com/mui-org/material-ui/issues/27651【参考方案2】:

这对我有用:

import  SxProps  from '@mui/system';
import  Theme  from '@mui/material/styles';

const style: SxProps<Theme> = 
  position: 'absolute',
  top: '50%',
  left: '50%',
  transform: 'translate(-50%, -50%)',
  width: '100%',
  maxWidth: 900,
  bgcolor: 'background.paper',
  border: '1px solid #a7a7a7',
  boxShadow: 24,
  p: 4,


...

<Box sx=style>

【讨论】:

感谢分享您的解决方案!我们希望避免在所有组件中依赖这些类型。我们正在切换到 styled() API 以避免这个问题

以上是关于为啥 sx 道具类型检查失败?的主要内容,如果未能解决你的问题,请参考以下文章

无效的道具:道具“背景” elementui el-pagination 的类型检查失败

vue 警告:无效的道具:道具“modalState”的类型检查失败。预期布尔值,得到函数

如何将 ref 作为道具传递:[Vue 警告]:无效的道具:道具“containerRef”的类型检查失败。预期对象,得到 HTMLDivElement?

[Vue 警告]:无效的道具:道具“值”的类型检查失败。预期的数组,得到值为 1 的数字

Vue.js - 无效的道具:道具“src”的类型检查失败。预期的字符串,对象,得到了 Promise

无效的道具:道具“ cellClass”的类型检查失败。期望的字符串,其值为“ [object Object]”,得到Object