TypeScript无法识别来自节点模块的.d.ts

时间:2019-05-08 12:58:03

标签: typescript

我正在使用babel-plugin-react-intl-auto和TypeScript。

此软件包已在lib/types.d.ts中定义了类型(使用npm安装时,它在lib中)。这些会覆盖其他软件包的类型。

import { FormattedMessage } from 'react-intl'

declare module 'react-intl' {
  interface ExtractableMessage {
    [key: string]: string
  }

  export function defineMessages<T extends ExtractableMessage>(
    messages: T
  ): { [K in keyof T]: FormattedMessage.MessageDescriptor }
}

他们已在package.json

中指定了此内容
{
  // ...
  "types": "lib/types.d.ts",
  // ...
}

一切似乎都很好。但是,当我使用此程序包时,TypeScript抱怨defineMessages的功能签名。

如果我将这些类型复制到我自己的 index.d.ts 中,它将按预期工作。

为了完整起见,这是我的 tsconfig.json

{
  "compilerOptions": {
    "noEmit": true,
    "noImplicitAny": true,
    "esModuleInterop": true,
    "jsx": "react",
    "lib": ["es5", "es6", "dom"]
  }
}

为什么TypeScript不使用这些类型?

1 个答案:

答案 0 :(得分:1)

这很可能是因为TypeScript没有关于要使用的defineMessages版本的上下文。
TypeScript支持merging declarations,在导入模块时也会应用。

babel-plugin-react-intl-autoreact-intl一起导入应合并这些定义,以使TypeScript能够理解这两种语法。