在@types命名空间下使用自定义的typescript打字员作为NPM包*NOT*



在我的公司,我们希望根据GraphQL API自动生成我们的打字员,并将这些打字员打包成一个包,我们可以与使用API而不是依赖复制意大利面的所有客户联系。我一直在阅读TypeScript文档,对如何告诉TypeScript这些自定义打字法有点困惑。

根据我的阅读,TypeScript将自动查找node_modules/@types/*。不幸的是,由于这是内部API,我们不想在DefinelyTyped存储库下发布(我还没有发现你不能显式地编写和@types/package,它是一个私有模块(。因此,无论如何,这意味着无论我们给包起什么名字,TypeScript都不会自动查看。

我读到关于typestypeRoots的文章,认为这些可能是我需要使用的选项。根据我的阅读,types是我可以指定我希望TypeScript包含的@types的一种方式,这是一种樱桃采摘选项。typeRoots似乎是我应该使用的;然而,它表示只有此选项下的包才会包含在内。我的假设是,我需要做以下事情(我们仍然需要@types下的定义(:

{
"compilerOptions": {
"typeRoots": ["node_modules/@types", "node_modules/@companyOrg/customTypings"]
}
}

有没有人在做类似的事情,并找到了一种方法让TypeScript包含你的自定义打字员,而这些打字员不在@types的保护伞下?请注意,我说的不是在项目目录中创建custom.d.ts,而是使用类似于@types/react的NPM包,除了@company/our-types之类的东西。

当前tsconfig.json:

{
"compilerOptions": {
"target": "es5",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
"preserveSymlinks": true,
"typeRoots": [
"node_modules/@types",
"node_modules/@companyOrg/customTypings",
],
},
"include": [
"src"
],
}

此外,我正在本地工作,所以我使用了yarn link @company/our-types,也许这就是问题的根源。我已经检查了好几次路径,但一切似乎都很好。

让我展示适用于我的示例。有两个包:类型(可以是任何名称(和使用者。Types包包含我以d.ts文件形式的打字员,我在根目录中有index.d.ts(按照惯例,该文件用作入口点,但可以使用package.json中的types字段重新定义(

// types/index.d.ts
declare namespace MyLib {
interface MyInterface {
id: string;
}
}
export = MyLib;

我将types链接到consumer,并将"types": "*"添加到消费者的dependencies

{
"name": "consumer",
"version": "1.0.0",
"dependencies": {
"typescript": "^3.8.3",
"types": "*" // <----
}
}

之后,我可以在consumer:中使用从types导出的类型

// consumer/index.ts
import { MyInterface } from "types";
const y: MyInterface = { id: "1" };

它之所以有效,是因为TS在所有依赖项中寻找类型定义,并允许您在没有任何额外配置的情况下使用它们。