[英]TypeScript: How to define custom typings for installed npm package?
[英]Consuming custom typescript typings as NPM package *NOT* under @types namespace
At my company we are wanting to automate the generation of our typings against out GraphQL API and package those up into a package we can reach for with all of our clients that use the API instead of relying on copy pasta. 我一直在阅读 TypeScript 文档,对于如何告诉 TypeScript 这些自定义类型,我有点困惑。
从我的读数 TypeScript 将自动寻找node_modules/@types/*
。 不幸的是,因为这是内部 API 并且我们不想发布到definitelyTyped 存储库下(我还没有发现你不能显式地编写和@types/package
并且它是一个私有模块)。 所以无论如何,这意味着无论我们如何命名 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
也许这就是问题的根源。 我已经检查了几次路径,但一切似乎都很好。
让我展示一个对我有用的例子。 有 2 个包:类型(可以是任何名称)和消费者。 类型 package 包含我的d.ts
文件形式的类型,并且我在根目录中有index.d.ts
(此文件按惯例用作入口点,但可以使用 package.json 中的types
字段重新定义)
// types/index.d.ts
declare namespace MyLib {
interface MyInterface {
id: string;
}
}
export = MyLib;
我将 npm 链接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 在所有依赖项中寻找类型定义,并允许您在没有任何额外配置的情况下使用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.