typescript 类型'string'不能赋值给type -如何在数组中键入对象?

eufgjt7s  于 2023-02-14  发布在  TypeScript
关注(0)|答案(2)|浏览(201)

我有一个长数组:

const allRoles = {
   'product_manager': [
      {
         id: 'productManager_1',
         image: '/icon.png',
         title: 'CEO of the product',
         description: 'Some description'.</>,
      },
   'backend_engineer': [{...}]
   ...
}

组件代码:

// roleTitle = "Product Manager"
export function OverviewModal(roleTitle: string) {

  const convertedRole: keyof typeof allRoles = roleTitle.toLowerCase().replace(/ /g,'_');
  const roleCardInfo = allRoles[convertedRole];
  // Tried the above but got an error:
  // Type 'string' is not assignable to type '"product_manager" | "backend_engineer"...'.ts(2322)

在这种情况下,这似乎并不适用:Typescript Type 'string' is not assignable to type
而不是一个类,我只是有一个数组对象。我不知道在这个场景中它会是什么类型。

m2xkgtsf

m2xkgtsf1#

岑根说得对。
但是,如果您能够在编译时知道AllRoles的键,您可能会有一个解决问题的方法,如下所示:

const roleTypeNames = ['product_manager','backend_engineer'] as const;
type roleType = typeof roleTypeNames[number]

const allRoles : {[key in roleType]:any} = { ... };

如果是,那么您可以使用typeguard。

const isRoleType = (candidate : string) : candidate is roleType => {
    for(const role of roleTypeNames)
    {
        if(role === candidate) return true  ;
    }
    return false;
}

 function OverviewModal(roleTitle: string) {
    const sanitizedRoleTitle = roleTitle.toLowerCase().replace(/ /g,'_');
    if(isRoleType(sanitizedRoleTitle))
    {  
        const roleCardInfo = allRoles[sanitizedRoleTitle];
    }
  }
zazmityj

zazmityj2#

所以在这一部分,您实际上是在说convertedRole应该是allRoles的某个键。

const convertedRole: keyof typeof allRoles

allRoles的类型是您要赋予它的值的形式。并且您已将参数roleTitle声明为字符串。因此,字符串对于convertedRole的类型来说还不够窄。只能为convertedRole分配与allRoles类型的键相同的字符串,即字符串“product_manager”|“后端工程师”...“。
请记住,typescript在运行时并不存在,它不能在您运行代码时知道roleTitle的实际值。

相关问题