为 scss 在 parcel 中生成 TypeScript 类型

Generating TypeScript typings in parcel for scss

根据我在 the documentation 中收集到的信息,只需很少的配置并且无需 tsconfig.json

我要解决的问题是:Cannot find module './styles.module.scss' or its corresponding type declarations. ts(2307)

这是我的项目结构:

我尝试过的事情:

我不确定如何解决这个问题,感觉实际上必须做出某种 tsconfig.jsontypes 声明。

我只是想在这样做之前检查这里,看看是否有一种方法可以解决这个问题而无需制作额外的文件。有什么建议吗?

不幸的是,我认为 parcel 没有开箱即用的方法来生成必要的 .d.ts 文件来为 .scss 模块提供强类型。您在上面链接的 Generating Types documentation 描述了编写库的人(例如,其他人发布和使用的 npm 包)如何使用 parcel 生成一个合并的 .d.ts 文件,该文件描述了 .js 生成的包按包裹,这听起来不像您的用例。

幸运的是,有一个很棒的工具叫做typed-scss-modules,它可以生成.d.ts个文件来描述你项目中的所有.module.scss个文件,并且把它集成到一个parcel中是相当简单的基于项目。这是您需要做的:

  1. 安装typed-scss-modules
     yarn add -D typed-scss-modules
    
  2. 向您的 package.json 添加一个命令,该命令将为您项目中的所有 .module.scss 文件生成 .d.ts 文件:
    "build:scss-types": "tsm src --nameFormat none --exportType default",
    
    默认情况下,typed-scss-modules 会将 .scss 文件中定义的 classes 的名称转换为驼峰式,并删除破折号。这不是 parcel 的行为方式(它将保持 class 名称不变)。但是您可以使用 --nameFormat none 选项与宗地行为保持一致。
  3. 然后,您可以像这样将 class 名称导入到您的打字稿文件中:
    import classes from "./styles.module.scss";
    
    (请注意这是如何使用默认导出的,而不是 import * from 语法 - 这与上面的 --exportType default 选项一致)。
  4. 现在 VSCodetsc@parcel/validator-typescript 应该很高兴。如果您在引用 classes 导入中的名称时出现拼写错误,您将获得 Intellisense 和错误。
  5. 为了获得最佳工作流程,您可以考虑将 build:scss-types 命令添加到构建和 CI 管道中,这样如果您犯了命名错误,就会出现构建时错误。您还可以 运行 tsm 使用 --watch 选项在开发过程中自动重新生成 .d.ts 文件。

这里是a repo where this is all working,您可以将其用作示例。