Typescript 中的材质 UI 选择

Posted

技术标签:

【中文标题】Typescript 中的材质 UI 选择【英文标题】:Material UI Select in Typescript 【发布时间】:2020-06-17 07:17:25 【问题描述】:

我使用 Material UI select 创建了一个下拉菜单。它说“搜索依据”。当我们点击它时,它会给我们一个列表。当我选择其中一个选项时,我想存储该选项并将“搜索依据”更改为所选选项。

export default function UserSearchPage()
  const [criteria, setCriteria] = useState('');
  const [searchItem, setSearchItem] = useState('');
  return (
    <div>
      <div className='main-content'>
        <Select 
          value = criteria
          onChange=
            value =>  setCriteria(value);
          
          displayEmpty
        >
          <MenuItem disabled value="">
            <em>Search By</em>
          </MenuItem>
          <MenuItem value=1>First Name</MenuItem>
          <MenuItem value=2>Last Name</MenuItem>
          <MenuItem value=3>Phone Number</MenuItem>
          <MenuItem value=4>Email</MenuItem>
        </Select>
      </div>
    )
    </div>
  );

目前,onChange 给我这个值错误:

Argument of type 'ChangeEvent< name?: string | undefined; value: unknown; >' is not assignable to parameter of type 'SetStateAction<string>'.
  Type 'ChangeEvent< name?: string | undefined; value: unknown; >' is not assignable to type '(prevState: string) => string'.

如果我使用这个:

onChange=event => setCriteria(event.target.value)

我明白了:

Argument of type 'unknown' is not assignable to parameter of type 'SetStateAction<string>'.
  Type 'unknown' is not assignable to type '(prevState: string) => string'.

【问题讨论】:

【参考方案1】:

您必须在使用 unknown 类型值之前对其进行断言。如果您确定来自 onChange 事件的值将始终是字符串,那么您可以执行 onChange=event =&gt; setCriteria(event.target.value as string) 并且编译器应该不再抱怨。

【讨论】:

这可行,但我有点困惑。我在同一页面的搜索栏上使用它,它可以工作onChange=value =&gt; setSearchItem(value);那么为什么相同的模式对选择不起作用? 我假设您的意思是您的TextInputonChangeTextInputonChangeSelectonChange 的类型定义不一样。 Material UI 开发人员出于某些(我确信这是合理的)原因决定将value 类型设为unknown,因此您必须对此进行断言。 不,我的意思是 onChange() 用于 Material UI 的 SearchBar,但是解释是有道理的 @giotskhada 谢谢你的回答。你有什么建议可以在使用联合类型(例如字符串|数字)时实现这一点吗?【参考方案2】:

为您的事件参数定义一个类型。所以会是

onChange=event:React.ChangeEvent< value: unknown > => setCriteria(event.target.value)

【讨论】:

我在 onChange 上收到此错误:No overload matches this call. Overload 1 of 2, '(props: SelectProps, context?: any): ReactElement&lt;any, string | ((props: any) =&gt; ReactElement&lt;any, string | ... | (new (props: any) =&gt; Component&lt;any, any, any&gt;)&gt; | null) | (new (props: any) =&gt; Component&lt;...&gt;)&gt; | Component&lt;...&gt; | null', gave the following error. Cannot find name 'value'. 也许您可以在将 .js 文件更改为 .tsx codesandbox.io/s/… 后尝试这里 如果您有严格的 lint 验证,这将失败。第一个答案是这样做的安全方法。

以上是关于Typescript 中的材质 UI 选择的主要内容,如果未能解决你的问题,请参考以下文章

我们是不是可以在不使用 Datepicker 的情况下将材质 UI 选择器中的 Calendar 组件用作独立组件 - 如果可以,如何?

材质 UI 在点击“选项卡”时未选择 SelectField

选定的值未显示在文本字段选择中 - 材质 UI 反应组件

材质 UI 按钮移除焦点框

如何更改材质 UI 警报组件的类型?

TypeScript 中的 Angular 材质示例:芯片