typescript 元素隐式具有“any”类型,因为“string”类型的表达式不能用于使用类型脚本对类型进行索引?

jjjwad0x  于 2023-03-19  发布在  TypeScript
关注(0)|答案(2)|浏览(137)

我正在尝试修复此错误“由于类型为”string“的表达式不能用于索引类型,因此元素隐式具有”any“类型”
下面是我的代码,

enum Status {
      CANCELLED = 'cancelled',
      FAILED = 'failed',
  }

  const titleByStatus = {
      [Status.CANCELLED]: (name: string) => {
          return `${name} is cancelled`;
      },
      [Status.PASSED]: (name: string) => {
          return `${name} matches`;
      },
  };

  const getTitle = () => {
      if (result) {
          if (result.title && result.title !== '') {
              return result.title;
          } else {
              creturn titleByStatus[Status.CANCELLED](name) //error here
          }
       } else {
           return something[Status.CANCELLED];
       }

我有这个getTitle正在使用的2个地方的结果是不同的和状态。取消被替换为一些东西。状态
所以我试着重写可重用的代码

const getTitle = (result: any, status: someTypefromQuery, name: string) => {
      if (result) {
          if (result.title && result.title !== '') {
              return result.title;
          } else {
              return titleByStatus[status](name) //error here
          }
       } else {
           return something[status];
       }
   };

但我得到错误元素隐式具有'any'类型,因为'string'类型的表达式不能用于使用typescript的索引类型?
我在两个地方这样称呼它const title = getTitle(结果,状态.已取消,名称)const title = getTitle(结果,某个东西.状态,名称)
有人能帮我一下吗?谢谢。

byqmnocz

byqmnocz1#

第二个函数要达到什么目的还不完全清楚(result.title ......那么title是要在特定于状态的上下文中测试与给定事件名称的匹配吗?)
无论如何,我想这会有帮助

enum Status {
  CANCELLED = "cancelled",
  FAILED = "failed",
  PASSED = "passed"
}

const titleByStatus = {
  [Status.CANCELLED]: (name: string) => {
    return `${name} has been cancelled`;
  },
  [Status.PASSED]: (name: string) => {
    return `${name} matches (has passed)`;
  },
  [Status.FAILED]: (name: string) => {
    return `${name} has failed`;
  }
} as const;

const getTitle = (
  name: string,
  status: keyof typeof Status,
  result?: { title?: string }
) => {
  if (
    result?.title &&
    result?.title !== "" &&
    typeof result.title !== "undefined"
  ) {
    return result.title;
  } else {
    return status === "CANCELLED"
      ? titleByStatus[Status.CANCELLED](name)
      : status === "FAILED"
      ? titleByStatus[Status.FAILED](name)
      : titleByStatus[Status.PASSED](name);
  }
};

console.log(getTitle("test", "FAILED", {title: undefined}));
console.log(getTitle("test", "CANCELLED", {title: undefined}));
console.log(getTitle("test", "PASSED", {title: undefined}));
console.log(getTitle("test", "PASSED", {title: "I take priority when not undefined"}));

此输出

[LOG]: "test has failed" 
[LOG]: "test has been cancelled" 
[LOG]: "test matches (has passed)" 
[LOG]: "I take priority when not undefined"

索引隐式具有any类型,因为在对象索引中使用了枚举,而没有将对象字段定义为readonly,这是as consttitleByStatus对象定义之后实现的。现在有0个索引错误,您可以在此处的typescript playground链接上查看它

qoefvg9y

qoefvg9y2#

您可以尝试使用这个工作代码,它来自您的示例。

export enum Status {
    CANCELLED = 'cancelled',
    FAILED = 'failed',
    PASSED = 'passed'
}

const titleByStatus = {
    [Status.CANCELLED]: (name: string) => {
        return `${name} is cancelled`;
    },
    [Status.PASSED]: (name: string) => {
        return `${name} matches`;
    },
};

const getTitle = (result: { title: string; }) => {
    if (result) {
        if (result.title && result.title !== '') {
            return result.title;
        } else {
            return titleByStatus[Status.CANCELLED]('name') //error here
        }
    } else {
        return titleByStatus[Status.CANCELLED];
    }
}

相关问题