【问题标题】:Typescript error No index signature with a parameter of type 'string' was found on type打字稿错误在类型上找不到带有“字符串”类型参数的索引签名
【发布时间】:2021-11-27 10:56:12
【问题描述】:

我对 TS 很陌生...我有这种特殊的类型:

export type MyType = {
  high: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
  low: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
  medium: {
    age: number;
    preview: [{ [key: string]: string | number }];
  };
};

我通过我的数据对象键映射:

{Object.keys(data)          
         .map((item: string, key: number) => {
            return (
              data &&
              data[item]?.preview && (
                < component here >
              )
            );
          })}

数据类型正确,但 TS 报错“data[item]?.preview”。

上面写着:

元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“MyType”。 在“MyType”类型上找不到带有“string”类型参数的索引签名。

谢谢

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    问题是因为MyType的键只能有三个值:“中”、“高”和“低”。

    但是您的项目是string 类型,并且可以包含任何字符串。 TS 抱怨。

    现在你会认为你可以添加类似的东西

    objKeys.map((item: keyof MyType, key: number) => {
    

    这应该有效。 但是带有Object.keys() 的TS 没有返回一个键数组,而是一个字符串数组。 Github 线程表明这在未来不会改变。

    因此,一种方法是添加一个中间步骤并使用 as 关键字对其进行类型转换:

    {let objKeys = Object.keys(data) as Array<keyof MyType>          
             objKeys.map((item: keyof MyType, key: number) => {
                return (
                  data &&
                  data[item]?.preview && (
                    < component here >
                  )
                );
              })}
    

    Playground Link

    【讨论】:

    • 感谢您的回复。现在它说:Argument of type '(item: keyof MyType, key: number) => JSX.Element | undefined' 不能分配给 '(value: string, index: number, array: string[]) => Element | 类型的参数不明确的'。参数“item”和“value”的类型不兼容。类型“string”不可分配给类型“keyof MyType”。它不再抱怨:data[item]?.preview
    • 我也添加了游乐场链接。您是否制作了中间对象 objKeys。请检查答案,并可能添加类似的 Playground 链接来显示您的问题
    • 是的,我创建了变量 const tabsKeys = Object.keys(data) as Array;在循环中我有: {tabsKeys .map((item: keyof MyType, key: number) => { return ( data && data[item]?.preview && ( ) ); })} 的类型为 prop: data: { [key: string]: string }[];
    • 请添加游乐场链接。很难像这样弄清楚。
    • 我知道了..循环在一个以 tabsKeys 作为参数的函数内..我没有在那里指定类型。我做了 function myFunc(tabsKeys: string[]) { 而不是 function myFunc(tabsKeys: Array) { 现在它停止抱怨了,谢谢!
    猜你喜欢
    • 2019-10-27
    • 2020-01-06
    • 1970-01-01
    • 2021-10-16
    • 2021-08-16
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多