在我的公司,我们希望根据GraphQL API自动生成我们的打字员,并将这些打字员打包成一个包,我们可以与使用API而不是依赖复制意大利面的所有客户联系。我一直在阅读TypeScript文档,对如何告诉TypeScript这些自定义打字法有点困惑。
根据我的阅读,TypeScript将自动查找node_modules/@types/*
。不幸的是,由于这是内部API,我们不想在DefinelyTyped存储库下发布(我还没有发现你不能显式地编写和@types/package
,它是一个私有模块(。因此,无论如何,这意味着无论我们给包起什么名字,TypeScript都不会自动查看。
我读到关于types
和typeRoots
的文章,认为这些可能是我需要使用的选项。根据我的阅读,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在所有依赖项中寻找类型定义,并允许您在没有任何额外配置的情况下使用它们。