Typescript 使用“ts_库”中的非“.ts'/'.tsx”文件作为依赖项

Typescript 使用“ts_库”中的非“.ts'/'.tsx”文件作为依赖项,typescript,bazel,Typescript,Bazel,我正在尝试从typescript导入json文件是的,我在tsconfig中使用resolveJsonModule标志。问题是,我不知道如何将此json文件提供给ts_库。这对于任何其他非.ts和.tsx文件(如.env)也是有效的。ts_图书馆总是告诉我他找不到我的json文件 例如,如果我在BUILD.bazel中有这个ts_库: 使用此索引.ts: 从“/test.json”导入测试; 控制台日志测试; 这个test.json: 它会给我这个: index.ts:1:18 - error

我正在尝试从typescript导入json文件是的,我在tsconfig中使用resolveJsonModule标志。问题是,我不知道如何将此json文件提供给ts_库。这对于任何其他非.ts和.tsx文件(如.env)也是有效的。ts_图书馆总是告诉我他找不到我的json文件

例如,如果我在BUILD.bazel中有这个ts_库:

使用此索引.ts:

从“/test.json”导入测试; 控制台日志测试; 这个test.json:

它会给我这个:

index.ts:1:18 - error TS2307: Cannot find module './test.json'.
我想我需要在规则的deps中添加json文件。但是我不知道怎么做,因为deps不接受像//:test.json这样的直接文件。

您可以通过data属性将文件添加到ts_库规则中。在这里,您可以添加对JSON文件的引用

但是,ts_库将覆盖输出模块格式,resolveJsonModule只能与commonjs、amd、es2015或esNext ts_库一起使用,并将其覆盖到UMD

Option '--resolveJsonModule' can only be specified when module code generation is 'commonjs', 'amd', 'es2015' or 'esNext'.
但是,如果直接通过Bazel而不是通过ts_库使用typescript编译器,则可以执行此操作:

load("@npm//typescript:index.bzl", "tsc")

srcs = glob(["*.ts"])
deps = ["@npm//@types/node"]
data = ["test.json"]

tsc(
    name = "src",
    data = srcs + deps + data,
    outs = [s.replace(".ts", ext) for ext in [".js", ".d.ts"] for s in srcs],
    args = [
        "--outDir",
        "$(RULEDIR)",
        "--lib",
        "es2017,dom",
        "--downlevelIteration",
        "--declaration",
        "--resolveJsonModule",
    ] + [
        "$(location %s)" % s
        for s in srcs
    ],
)
您可以使用nodejs_二进制文件测试它是否工作:

有关使用tsc而非ts_库的更多信息,请参见此处:

您可以通过数据属性将文件添加到ts_库规则中。在这里,您可以添加对JSON文件的引用

但是,ts_库将覆盖输出模块格式,resolveJsonModule只能与commonjs、amd、es2015或esNext ts_库一起使用,并将其覆盖到UMD

Option '--resolveJsonModule' can only be specified when module code generation is 'commonjs', 'amd', 'es2015' or 'esNext'.
但是,如果直接通过Bazel而不是通过ts_库使用typescript编译器,则可以执行此操作:

load("@npm//typescript:index.bzl", "tsc")

srcs = glob(["*.ts"])
deps = ["@npm//@types/node"]
data = ["test.json"]

tsc(
    name = "src",
    data = srcs + deps + data,
    outs = [s.replace(".ts", ext) for ext in [".js", ".d.ts"] for s in srcs],
    args = [
        "--outDir",
        "$(RULEDIR)",
        "--lib",
        "es2017,dom",
        "--downlevelIteration",
        "--declaration",
        "--resolveJsonModule",
    ] + [
        "$(location %s)" % s
        for s in srcs
    ],
)
您可以使用nodejs_二进制文件测试它是否工作:

有关使用tsc而非ts_库的更多信息,请参见此处:

谢谢你,效果很好。我唯一需要添加的是-esModuleInterop,这样tsc在构建时不会抛出任何错误,我已经对您的答案进行了编辑。很抱歉回复时间太长!docs链接不再起作用了,但是有没有一个新的ts_项目替代方案?谢谢你,它工作得很好。我唯一需要添加的是-esModuleInterop,这样tsc在构建时不会抛出任何错误,我已经对您的答案进行了编辑。很抱歉回复时间太长!docs链接不再起作用了,但ts_项目是否有新的替代方案?
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")

nodejs_binary(
    name = "src_bin",
    data = [
        ":src",
    ] + data,
    entry_point = "//src:index.ts",
)