繁体   English   中英

在 @types 命名空间下使用自定义 typescript 类型为 NPM package *NOT*

[英]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 都不会自动查看。

我阅读了有关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也许这就是问题的根源。 我已经检查了几次路径,但一切似乎都很好。

让我展示一个对我有用的例子。 有 2 个包:类型(可以是任何名称)和消费者。 类型 package 包含我的d.ts文件形式的类型,并且我在根目录中有index.d.ts (此文件按惯例用作入口点,但可以使用 package.json 中的types字段重新定义)

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

export = MyLib;

我将 npm 链接typesconsumer中,并将"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM