【问题标题】:TypeScript checks and declarations in regular JS常规 JS 中的 TypeScript 检查和声明
【发布时间】:2021-12-21 16:45:27
【问题描述】:

所以基本上我想在编辑器(VS Code)中使用 TypeScript 检查我的代码是否有错误,但不想执行任何转译步骤。

我的代码在 .js 文件中,"allowJs": true 在 tsconfig.json 中

唯一的问题是,编辑器会抱怨在 js 文件中使用 typescript-words,例如:

declare module "something" {
    export interface MyInterface {

导致错误:

 "'module' declarations can only be used in TypeScript files"

我尽量不在乎,但不幸的是,它在运行实际的 (node.js) 程序时也会导致错误!

SyntaxError: Unexpected strict mode reserved word
    at Loader.moduleStrategy (internal/modules/esm/translators.js:145:18)

我不能以某种方式在没有 TS 的情况下进行 TS 检查吗?

我知道我可以,我的意思是它就在那里,但是我必须在应用启动之前删除与 TS 相关的所有内容。

IDK 也许有人有一个...转译器? :D

令人惊讶的是,互联网上没有太多关于此的信息。

我不会把TS转JS的原因:

  • 花费时间
  • 代码一团糟。它有我从未写过的随机函数,还有“var” 无处不在
  • 错误的行号来自自动生成的 .JS 文件(f**ked up)
  • 我为什么还要编译脚本语言

【问题讨论】:

  • 您只需要添加一个单独的.d.ts 文件并在那里声明您的类型。请参阅:How to use TypeScript declaration files alongside JavaScriptAbout "*.d.ts" in TypeScript
  • 如果不添加类型注释(=需要转译器),您的体验不会很好,但总比没有好
  • 感谢 .d.ts 文件确实有帮助。好像我什至不必将它包含在项目中。但是,是的,我希望在函数等中有注释。
  • UPD:我意识到我的 .js 文件发生了很大变化,因为我使用的是 SWC 而不是 TSC。 TSC 似乎只从文件中删除空格。嗯。必须想办法解决这个问题。

标签: javascript node.js typescript jsdoc


【解决方案1】:

是的,你绝对可以。而且你也不需要 TypeScript 声明文件。

如果您在 CLI 配置或 tsconfig.json 文件中设置了 checkJs flag,TypeScript 将很乐意检查您的 vanilla JS 代码。 allowJs 实际上与它无关,只是 enforces whether you can import vanilla JS files into TS/TSX files (它不关心你是否将 JS 导入 JS)。 JSDoc 注解实际上是在混合代码库中混合原始 JS 和 TS 代码的好方法,例如,如果您正在将代码从 JS 迁移到 TS。

TypeScript(即使没有 JSDoc 注释)将为您提供大量有用的“隐式”类型检查,而无需编写任何额外的语法,只需检测您如何声明变量并假设它们的类型不应该改变(以及其他推论):


// Implicit TypeScript typing
let myBooleanValue = false;
myBooleanValue = 'true'; // Error: Type 'string' is not assignable to type 'boolean'.ts(2322)

如果您想要更多控制权,TypeScript 与JSDoc type annotations 完全兼容。确保您阅读文档并使用正确的注释语法(例如 /** ... */ 而不是 // ...)。使用 TypeScript 语法几乎没有什么是你不能用 JSDoc 做的,只是有点冗长:

// Explicit JSDoc typing
/**
 * @type {string}
 */
let myVar;
myVar = 7; // Error: Type 'number' is not assignable to type 'string'.ts(2322)

您可以使用它获得更高级的功能,声明函数参数、对象结构和嵌套字段、返回值等内容:

/**
 * @param {object} myParam
 * @param {number} myParam.myNumber
 * @returns {boolean} // Error: A function whose declared type is neither 'void' nor 'any' must return a value.ts(2355) (because nothing is currently returned from myFunction)
 */
function myFunction(myParam) {
  let myNumberCopy = myParam.myNumber;
  let myMissingPropertyCopy = myParam.myMissingProperty; // Error: Property 'myMissingProperty' does not exist on type '{ myNumber: number; }'.ts(2339)
}

你甚至可以做一些疯狂的事情,比如从其他文件或包中导入类型并在你的 JSDoc 注释中使用它:

/**
 * @type {import("React").FC}
 */
const MyComponent = () => null;

这是我在上述示例中使用的tsconfig.json 文件,除了安装了基本的typescript NPM 包外什么都没有:

{
  "compilerOptions": {
    "module": "es6",
    "noEmit": true,
    "checkJs": true,
    "moduleResolution": "node"
  },
  "include": ["src/**/*"]
}

视觉证明这一切在 VSCode 中运行良好:

使用此设置“测试”您的整个代码库中是否有任何类型错误的好方法是运行 npx tsc --noEmit,它将根据您的 @ 为您的所有文件运行 TypeScript 检查(包括 JSDoc 注释) 987654339@文件。

【讨论】:

  • 谢谢!我之前的代码中有 JSDoc cmets。虽然我认为打字稿注释更好。基本上我的问题是我无法弄清楚文件中错误行的错误在哪里。如果打字稿除了删除注释之外什么都不改变,那很好。
  • “我无法弄清楚文件中的错误行错误在哪里”是什么意思?
  • Nodejs 将错误写入控制台,说“第 N 行发生了一些事情”,但由于我的 TS 文件与实际 JS 文件不同,因此行号完全错误(N+1、N+123 等) .而且所有这些东西都在特定环境中运行,我对它的控制比对常规 nodejs 应用程序的控制要少(无法调试)。
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 2013-08-09
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
相关资源
最近更新 更多