如何从函数返回的对象键和值生成字符串文字的类型?

盖伊

我正在尝试从只读对象创建类型,即

const Actions = {

  'user.crud': ['user.create', 'user.read', 'user.update', 'user.delete'],

} as const

type ActionsType = keyof typeof Actions | typeof Actions[keyof typeof Actions][number]

上面的方法很好地工作并将类型ActionsType设置为字符串文字(“ user.crud”,“ user.create”等)。

但是,Actions上面对象非常简单,实际上,我确实需要通过函数来​​生成动作。当我将上述内容移植到由函数生成时,即

// set up a function to generate all actions for the passed role
function getActions (role: string): Record<string, string[]> {

    return {
        [`${role}.crud`]: [`${role}.create`, `${role}.read`, `${role}.update`, `${role}.delete`],
    }

}

// generate the Actions from a function
const ActionsFromFunction = {

  ...getActions('user'),

} as const

// set up the Actions from a readonly object with values generated by getActions()
type ActionsFromFunctionType = keyof typeof ActionsFromFunction | typeof ActionsFromFunction[keyof typeof ActionsFromFunction][number]

该类型ActionsFromFunctionType不再设置为字符串文字。而是将其设置为:string | number并且依次类型测试失败,因为接受任何字符串。

我整理了上面的演示:

操场

有没有一种方法可以Actions通过函数生成对象,同时仍将字符串文字保持在类型内?

守护者

您的目标只能通过Typescript模板文字类型实现它们在Typescript 4.0中不受支持,但在4.1版本中可用。

这是使用打字稿4.1的方法

type CrudOperations<ROLE extends string> = [`${ROLE}.create`, `${ROLE}.read`, `${ROLE}.update`, `${ROLE}.delete`];

type GetActionsResult<ROLE extends string> = string extends ROLE // check if we can infer type
  ? { [k: string]: string[] } // if type is not inferable
  : { [K in `${ROLE}.crud`]: CrudOperations<ROLE> };

function getActions<ROLE extends string>(role: ROLE): GetActionsResult<ROLE> {
    return {
      [`${role}.crud`]: [`${role}.create`, `${role}.read`, `${role}.update`, `${role}.delete`]
    } as GetActionsResult<ROLE>;
}

// falls back to { string: string[] } structure
const actions = getActions('admin' as string);

// generate the Actions from a function
const ActionsFromFunction = {
  ...getActions('user'),
  ...getActions('orders'),
}

游乐场链接

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打字稿:从对象键和数组字符串值生成类型

来自分类Dev

打字稿-指定“键”类型,其中对象[对象的键]必须返回字符串[]

来自分类Dev

在字符串中使用对象函数的返回值

来自分类Dev

JavaScript:如何获取以特定字符串开头的对象的所有键和值?

来自分类Dev

如何将对象键和值转换为格式化的字符串?

来自分类Dev

如何将对象的键和值转换为逗号分隔的字符串?

来自分类Dev

dplyr:如何使用mutate函数创建结合了前缀字符串和值序列的键

来自分类Dev

使用JavaScriptSerializer反序列化JSON字符串以返回单个动态对象,而不是键和值的数组

来自分类Dev

Java - 如何从字符串中获取键和值?

来自分类Dev

如何仅从MongoDB数组返回对象的字符串值

来自分类Dev

如何获取返回字符串值的函数?

来自分类Dev

字符串与对象类型构造函数

来自分类Dev

如何在值和键中搜索和替换在整个对象中多次出现的字符串?

来自分类Dev

Map <String,String>,如何同时打印“键字符串”和“值字符串”

来自分类Dev

constexpr函数返回字符串文字

来自分类Dev

连接类型和字符串的函数

来自分类Dev

如果字符串与键条目匹配,如何返回键及其值

来自分类Dev

返回字符串和函数

来自分类Dev

尝试创建一个基于字典中“整数”值返回“字符串”键的函数

来自分类Dev

使用jquery或javascript将逗号和键和值字符串分隔为对象

来自分类Dev

JSON对象和字符串函数

来自分类Dev

Javascript函数:将字符串追加到对象并返回对象值

来自分类Dev

字符串文字和字符串对象

来自分类Dev

如何重命名对象键并将对象值从字符串更改为数字

来自分类Dev

比以字符串为键和列表作为值的字典更好的数据类型

来自分类Dev

比以字符串为键和列表作为值的字典更好的数据类型

来自分类Dev

如何从对象返回可读的字符串

来自分类Dev

在TypeScript中使用字符串文字基于对象属性的动态返回类型

来自分类Dev

编写一个检查参数是否为对象文字或函数或字符串值的函数

Related 相关文章

  1. 1

    打字稿:从对象键和数组字符串值生成类型

  2. 2

    打字稿-指定“键”类型,其中对象[对象的键]必须返回字符串[]

  3. 3

    在字符串中使用对象函数的返回值

  4. 4

    JavaScript:如何获取以特定字符串开头的对象的所有键和值?

  5. 5

    如何将对象键和值转换为格式化的字符串?

  6. 6

    如何将对象的键和值转换为逗号分隔的字符串?

  7. 7

    dplyr:如何使用mutate函数创建结合了前缀字符串和值序列的键

  8. 8

    使用JavaScriptSerializer反序列化JSON字符串以返回单个动态对象,而不是键和值的数组

  9. 9

    Java - 如何从字符串中获取键和值?

  10. 10

    如何仅从MongoDB数组返回对象的字符串值

  11. 11

    如何获取返回字符串值的函数?

  12. 12

    字符串与对象类型构造函数

  13. 13

    如何在值和键中搜索和替换在整个对象中多次出现的字符串?

  14. 14

    Map <String,String>,如何同时打印“键字符串”和“值字符串”

  15. 15

    constexpr函数返回字符串文字

  16. 16

    连接类型和字符串的函数

  17. 17

    如果字符串与键条目匹配,如何返回键及其值

  18. 18

    返回字符串和函数

  19. 19

    尝试创建一个基于字典中“整数”值返回“字符串”键的函数

  20. 20

    使用jquery或javascript将逗号和键和值字符串分隔为对象

  21. 21

    JSON对象和字符串函数

  22. 22

    Javascript函数:将字符串追加到对象并返回对象值

  23. 23

    字符串文字和字符串对象

  24. 24

    如何重命名对象键并将对象值从字符串更改为数字

  25. 25

    比以字符串为键和列表作为值的字典更好的数据类型

  26. 26

    比以字符串为键和列表作为值的字典更好的数据类型

  27. 27

    如何从对象返回可读的字符串

  28. 28

    在TypeScript中使用字符串文字基于对象属性的动态返回类型

  29. 29

    编写一个检查参数是否为对象文字或函数或字符串值的函数

热门标签

归档