代码之家  ›  专栏  ›  技术社区  ›  Temp Account

类型“false”没有调用签名。(tsserver 2349)

  •  0
  • Temp Account  · 技术社区  · 7 月前

    我收到以下内容的Typescript警告:

    let d: { [key: string]: { [k: string]: boolean } | number[] } = {
      blah: [],
    };
    d["blah"].push(2);
    

    警告:

     This expression is not callable.                                               
     Not all constituents of type 'boolean | ((...items: number[]) => number)'    
     are callable.                                                                  
     Type 'false' has no call signatures. (tsserver 2349)  
    

    代码有效,如果我控制台.log(d['blah']),我得到 [2] 。为什么我收到警告?如何更正(或忽略)?

    我的tsconfig:

    {
      "compilerOptions": {
        "target": "es2015",
        "lib": ["dom", "dom.iterable", "esnext"],
        "allowJs": true,
        "skipLibCheck": true,
        "strict": true,
        "noEmit": true,
        "esModuleInterop": true,
        "module": "esnext",
        "moduleResolution": "bundler",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "jsx": "preserve",
        "incremental": true,
        "plugins": [
          {
            "name": "next"
          }
        ],
        "paths": {
          "@/*": ["./*"]
        }
      },
      "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
      "exclude": ["node_modules"]
    }
    

    我试着打印到控制台,代码有效,所以我很困惑为什么警告有效

    1 回复  |  直到 7 月前
        1
  •  2
  •   brk    7 月前

    根据您定义的打字脚本界面 key 可以是数字数组,也可以是对象。

    所以你应该先检查一下 d['blah'] 是一个数组,然后推送该值

    interface IObjectType {
      [key: string]: {
        [k: string]: boolean
      } | number[]
    }
    
    
    let d: IObjectType = {
      blah: [],
    };
    if (Array.isArray(d['blah'])) {
      d["blah"].push(2);
    }