用新的扩展(更新)第三方旧类型声明接口

时间:2018-09-25 16:20:48

标签: typescript typescript-typings expo

我的问题是我正在使用旧的类型声明包(@types/expo)。这就是为什么我需要更新其中的一部分。我这样创建了一个新的打字文件。 (./typings/expo/index.d.ts

import * as expo from 'expo';

declare module 'expo' {
  var Icon: any;
  var SplashScreen: any;

  export interface AppLoadingProps {
    startAsync?: () => Promise<void[]>;
  }
}

有些零件开始工作,但我也开始出现此错误:

[ts] Subsequent property declarations must have the same type. 
Property 'startAsync' must be of type '(() => Promise<void>) | undefined', 
but here has type '(() => Promise<void[]>) | undefined'

我在google和打字稿论坛上搜索了它,但对此没有任何有意义的答案。是否可以更新具有相同道具的界面?还是我需要等到公司在definitelyTyped上更新其软件包之后?

我的tsconfig.json文件;

{
  "compilerOptions": {
    "target": "ES2017",
    "module": "es2015",
    "lib": [ /* Specify library files to be included in the compilation. */
      "es2017",
      "dom"
    ],
    "jsx": "react-native",
    "importHelpers": true,
    "strict": true,
    "noImplicitAny": true,
    "strictFunctionTypes": true,
    "noImplicitThis": true,
    "moduleResolution": "node",
    "typeRoots": [ /* List of folders to include type definitions from. */
      "./typings",
      "./node_modules/@types"
    ],
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "noEmitHelpers": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "build/dist"
  },
  "exclude": [
    "build",
    "node_modules"
  ],
  "types": [
    "typePatches"
  ]
}

1 个答案:

答案 0 :(得分:2)

如果您需要覆盖现有的属性声明以更改类型,则需要派生@types/expo类型。

最简单的方法可能是将index.d.ts文件复制到您的typings目录中并卸载原始的@types/expo软件包。或者,您可以使用Braid之类的工具(披露:我是Braid贡献者)直接从DefinitelyTyped存储库中导入types/expo/index.d.ts文件;这样做的好处是可以很容易地将上游更新与您自己的修改合并在一起,但是对于DefinitelyTyped而言无论如何都将很快更新就不重要了。

无论哪种方式,您都可以选择调整baseUrl and paths options,以便模块分辨率找到您的index.d.ts文件或为修改后的package.json包创建@types/expo,然后注册使用相对路径将它作为主要package.json中的依赖项。