为什么npm的exports字段不能在typescript中工作?

b1uwtaje  于 2023-08-06  发布在  TypeScript
关注(0)|答案(2)|浏览(84)

我们的库@ltonetwork/lto是用 typescript 编写的。我们使用tsclib文件夹中编译为JavaScript。
该软件包包含几个子软件包,这些子软件包位于包含index.ts文件的子文件夹中。
当试图导入一个子模块时,像这样

import {Transfer} from "@ltonetwork/lto/transactions";

字符串
我希望这能正常工作,但我得到了以下错误

test.ts:1:24 - error TS2307: Cannot find module '@ltonetwork/lto/transactions' or its corresponding type declarations.


@ltonetwork/lto的package.json包含

{
  "scripts": {
    "compile": "tsc -p ./tsconfig.json"
  },
  "main": "lib",
  "exports": {
    ".": "./lib/index.js",
    "./*": "./lib/*/index.js",
    "./package.json": "./package.json"
  },
  "files": [
    "lib",
    "interfaces.d.ts"
  ]
}


而tsconfig.json是

{
  "compilerOptions": {
    "alwaysStrict": true,
    "baseUrl": "",
    "lib": ["es2017.object", "es2015", "es6", "dom"],
    "module": "commonjs",
    "sourceMap": true,
    "declaration": true,
    "target": "es6",
    "paths": {},
    "rootDir": "src",
    "outDir": "lib"
  },
  "include": ["src"]
}


我尝试显式地命名子模块,而不是在exports中使用通配符,但这没有什么区别。
我做错了什么导致了这个导入问题?
编辑:**这与monorepos或yarn工作空间无关。**这是关于在npm中使用typescript 4.7.1-rc的exports字段。此功能在早期版本的typescript中不起作用。
有关详细信息,请参见https://github.com/microsoft/TypeScript/issues/33079
我也试过

{
  "scripts": {
    "compile": "tsc -p ./tsconfig.json"
  },
  "main": "lib",
  "exports": {
    ".": {
      "require": {
        "default": "./lib/index.js",
        "types": "./lib/index.d.ts"
      },
      "import": {
        "default": "./lib/index.js",
        "types": "./lib/index.d.ts"
      }
    },
    "./transactions": {
      "require": {
        "default": "./lib/transactions/index.js",
        "types": "./lib/transactions/index.d.ts"
      },
      "import": {
        "default": "./lib/transactions/index.js",
        "types": "./lib/transactions/index.d.ts"
      }
    },
    "./package.json": "./package.json"
  },
  "files": [
    "lib",
    "interfaces.d.ts"
  ]
}

ubof19bj

ubof19bj1#

确保使用库中的moduleResolutiontsconfig.json文件中设置为Node16NodeNext
编辑:bundler现在也是一个选项。

ifsvaxew

ifsvaxew2#

自Typescript 3.1以来,我们已经能够做到这一点,它不需要消费者拥有tsconfig.json

"typesVersions": {
    "*": {
        "path1": [ "./path/to/path1.d.ts" ],
        "path2": [ "./path/to/path2.d.ts" ],        
    }
},

字符串
这可能只适用于命名的子模块。

相关问题