MENU

使用pnpm遇到的一个小bug

October 27, 2023 • Read: 1814 • 学习记录

使用pnpm遇到的一个小bug

推荐阅读:(这期强烈推荐)

CAP 理论十二年回顾:"规则"变了

问题

在使用 pnpm 包管理工具,进行 tsc 编译时,

遇到错误:error TS2742:

The inferred type of 'Subclass' cannot be named without a reference to '../middle/node_modules/types/lib'. This is likely not portable. A type annotation is necessary.

github 上对应 issuesolution

issue-47663

solution

stackoverflow-76415855

环境

node:v18.17.1

pnpm:8.6.12

typescript:4.6.4

解决方式

下面的解决方式只是 issue 47663 中的一种,里面也还有其他的解决方式。

一个很小的复现:ts-indirect-type-reference-bug

在 consumer 包导入下面代码即可:

import type {} from "types";

代码展示

package consumer

import { createBaseClass } from "middle";

import type {} from "types";

// this will trigger an error
// index.ts:3:14 - error TS2742: The inferred type of 'Subclass' cannot be named without
// a reference to '../middle/node_modules/types/lib'. This is likely not portable. A type annotation is necessary.
export class Subclass extends createBaseClass() {}

package middle

import { Class } from "types";

export interface Counter {
  count: () => number;
}

export const createBaseClass = (): Class<Counter> => {
  return class implements Counter {
    private counter = 0;
    public count() {
      return ++this.counter;
    }
  };
};

package types

export interface Class<TInterface, TArgs extends Array<unknown> = never> {
  new (...args: TArgs): TInterface;
}