Typescript:具有枚举类型参数的函数分配给带有字符串参数类型的回调

Xun Yang

我有一个带有回调的下拉组件 onSelect:(option: string) => void

我将其用作一个应用程序中的排序选择器,其中的选项属于枚举类型:

enum SORT_OPTIONS {
  LATEST = 'LATEST',
  OLDEST = 'OLDEST'
}
const onSortSelect = (val: SORT_OPTIONS) => {...}
<MyDropdown onSelect={onSortSelect} ... />

和打字稿抱怨:

Type '(val: SORT_OPTIONS) => void' is not assignable to type '(option: string) => void'.
  Types of parameters 'val' and 'option' are incompatible.
    Type 'string' is not assignable to type 'SORT_OPTIONS'.  TS2322

这有点违反直觉,但很有意义,因为在MyDropdown字符串option中将传递给onSortSelect回调,这需要枚举值。

问题是在这里修复类型的最佳方法是什么?IMO两个函数的键入均正确,onSelect应接受任何字符串,因为MyDropdown可以在任何上下文中使用。onSortSelect应该只接受SORT_OPTIONS

目前,我正在转换onSortSelect的类型:<MyDropdown onSelect={onSortSelect as (val:string) => void} ... />但是感觉很冗长

Xun Yang

我设法用泛型修复了类型,没有打字稿错误

enum SORT_OPTIONS {
  NEWEST='1',
  OLDEST='2'
}

interface DropdownProps<T extends string> {
  onSelect: (val: T) => void;
  options: T[];
}

const Dropdown = <T extends string>(props: DropdownProps<T> & {children?: React.ReactNode}) =>{
  const {onSelect, options} = props;
  return <select onChange={(evt) => onSelect(evt.target.value as T)}>
    {options.map(option => <option>{option}</option>)}
  </select>

};



const TestComp:React.FC = () => {
  const onSelect = (val: SORT_OPTIONS) => {
    switch (val) {
      case SORT_OPTIONS.OLDEST:
        console.log('old');
        break;
      case SORT_OPTIONS.NEWEST:
        console.log('new');
        break;
    }
  };
  const onSelect2 = (val: string) => {
    console.log(val);
  };
  return <>
    <Dropdown
      options={[SORT_OPTIONS.NEWEST, SORT_OPTIONS.OLDEST]}
      onSelect={onSelect}
    />
    <Dropdown
      options={['aaa', 'bbb']}
      onSelect={onSelect2}
    />
    </>
};

注意

  1. 我无法Dropdown使用常规输入React.FC,请参见此处的讨论:如何在功能组件的React中的props中使用泛型?
  2. 我必须对通用类型进行类型转换。

如果您从链接中找到不同的结论,请发表评论。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在Visual Studio中将类型为'string'的参数分配给类型为'number'的参数

来自分类Dev

打字稿:“ RegExpMatchArray”类型的参数无法分配给“字符串”类型的参数

来自分类Dev

Typescript枚举键入错误(类型'string'的参数不能分配给类型的参数)

来自分类Dev

无法将类型“未知”的参数分配给类型“字符串”的参数

来自分类Dev

“字符串类型的参数不能分配给自定义类型的参数”的难看的问题

来自分类Dev

无法将类型“ ApolloServer”的参数分配给类型“ ApolloServerBase”的参数

来自分类Dev

“数字”类型的参数不能分配给“字符串”类型的参数。将旧项目导入新项目时

来自分类Dev

修复TS2345:无法将类型“ HTMLElement”的参数分配给类型“ HTMLInputElement”的参数

来自分类Dev

通过方法类型参数分配给类型成员的值会破坏类型等效性

来自分类Dev

使用Jest无法将类型“ openURL”的参数分配给类型“从不”的参数

来自分类Dev

不可分配给“字符串”类型。类型“无效”不能分配给类型“字符串”

来自分类Dev

无法将函数分配给具有通用参数的类型

来自分类Dev

类型'string |的参数 字符串[] | 解析的Q | ParsedQs []'无法分配给'string'类型的参数

来自分类Dev

提取:“字符串”类型的参数| 未定义”不能分配给“ RequestInfo”类型的参数

来自分类Dev

类型'string |的参数 “ null”不可分配给“ string”类型的参数。尝试将字符串类型转换为Integer

来自分类Dev

打字稿错误:TS2345:“ {主题类型:字符串;jsonFile:字符串; 输出:字符串;}; }”不能分配给“选项”类型的参数

来自分类Dev

减少数组功能的打字稿错误-无法将“字符串”分配给类型的参数

来自分类Dev

为什么将参数分配给回调?

来自分类Dev

如何在TypeScript中将具有成员的函数分配给变量?

来自分类Dev

将指针类型分配给字符串类型

来自分类Dev

无法在Visual Studio中将类型为'string'的参数分配给类型为'number'的参数

来自分类Dev

Angular4:编译失败:参数类型{路径:字符串,组件 HomeComponent}[] 不能分配给参数类型路由

来自分类Dev

Angular 5 错误 TS2345:“数字”类型的参数不可分配给“字符串”类型的参数

来自分类Dev

“数字”类型的参数不能分配给 angular2 中“字符串”类型的参数。

来自分类Dev

如何将具有可变数量参数的函数分配给单个变量?

来自分类Dev

带有字符串参数的Swift枚举函数使用枚举类的参数调用

来自分类Dev

'{ title: string; 类型的参数 描述:字符串;}' 不能分配给类型为 '{ id: {}; 的参数 标题: {}; 描述: {}; }'

来自分类Dev

打字稿告诉我“字符串 | T[]' 不能分配给类型为 'ReadonlyArray<T>' 的参数

来自分类Dev

“文件”类型的参数不能分配给“字符串”类型的参数

Related 相关文章

  1. 1

    无法在Visual Studio中将类型为'string'的参数分配给类型为'number'的参数

  2. 2

    打字稿:“ RegExpMatchArray”类型的参数无法分配给“字符串”类型的参数

  3. 3

    Typescript枚举键入错误(类型'string'的参数不能分配给类型的参数)

  4. 4

    无法将类型“未知”的参数分配给类型“字符串”的参数

  5. 5

    “字符串类型的参数不能分配给自定义类型的参数”的难看的问题

  6. 6

    无法将类型“ ApolloServer”的参数分配给类型“ ApolloServerBase”的参数

  7. 7

    “数字”类型的参数不能分配给“字符串”类型的参数。将旧项目导入新项目时

  8. 8

    修复TS2345:无法将类型“ HTMLElement”的参数分配给类型“ HTMLInputElement”的参数

  9. 9

    通过方法类型参数分配给类型成员的值会破坏类型等效性

  10. 10

    使用Jest无法将类型“ openURL”的参数分配给类型“从不”的参数

  11. 11

    不可分配给“字符串”类型。类型“无效”不能分配给类型“字符串”

  12. 12

    无法将函数分配给具有通用参数的类型

  13. 13

    类型'string |的参数 字符串[] | 解析的Q | ParsedQs []'无法分配给'string'类型的参数

  14. 14

    提取:“字符串”类型的参数| 未定义”不能分配给“ RequestInfo”类型的参数

  15. 15

    类型'string |的参数 “ null”不可分配给“ string”类型的参数。尝试将字符串类型转换为Integer

  16. 16

    打字稿错误:TS2345:“ {主题类型:字符串;jsonFile:字符串; 输出:字符串;}; }”不能分配给“选项”类型的参数

  17. 17

    减少数组功能的打字稿错误-无法将“字符串”分配给类型的参数

  18. 18

    为什么将参数分配给回调?

  19. 19

    如何在TypeScript中将具有成员的函数分配给变量?

  20. 20

    将指针类型分配给字符串类型

  21. 21

    无法在Visual Studio中将类型为'string'的参数分配给类型为'number'的参数

  22. 22

    Angular4:编译失败:参数类型{路径:字符串,组件 HomeComponent}[] 不能分配给参数类型路由

  23. 23

    Angular 5 错误 TS2345:“数字”类型的参数不可分配给“字符串”类型的参数

  24. 24

    “数字”类型的参数不能分配给 angular2 中“字符串”类型的参数。

  25. 25

    如何将具有可变数量参数的函数分配给单个变量?

  26. 26

    带有字符串参数的Swift枚举函数使用枚举类的参数调用

  27. 27

    '{ title: string; 类型的参数 描述:字符串;}' 不能分配给类型为 '{ id: {}; 的参数 标题: {}; 描述: {}; }'

  28. 28

    打字稿告诉我“字符串 | T[]' 不能分配给类型为 'ReadonlyArray<T>' 的参数

  29. 29

    “文件”类型的参数不能分配给“字符串”类型的参数

热门标签

归档