TypeScript 提供JavaScript文件的语法错误

bwntbbo3  于 5个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(58)

最近,we started reporting high-confidence errors for typos as suggestions in the language service。我们认为有一套值得犯错的语法问题没有在今天报告(例如:重复的块作用域变量、扩展多个类、剩余参数出现在常规参数之前等)。

未解决的问题:

  • 我们如何将其作为API的一部分实现?
  • 在这里允许哪些类型的错误?
  • 我们会给出与任何流行运行时、构建工具或语法扩展相悖的错误吗?
eulz3vhy

eulz3vhy1#

这是我的粗略笔记,稍作整理。这里只包括绑定错误。

运行时错误

这些错误都是JS中的错误,至少在V8中是这样。它们主要适用于严格模式下的上下文:.mjs文件和类体。实际上,这些错误足够好,它们应该使用与TS相同的规则:任何使用ES导出的JS文件都被视为真正的ES模块,并处于严格模式。(尽管目前.js文件通常是CommonJS。)
这些错误应始终提供给JS文件。

诊断

  • Diagnostics.Cannot_redeclare_block_scoped_variable_0
  • Diagnostics.A_module_cannot_have_multiple_default_exports
  • Diagnostics.Another_export_default_is_here
  • Diagnostics.and_here <-- (!) 这里可能被其他地方使用
  • Diagnostics.The_first_export_default_is_here
  • Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module
  • Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode
  • Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here
  • Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here
  • Diagnostics.constructor_is_a_reserved_word
  • Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode
  • Diagnostics.Invalid_use_of_0
  • Diagnostics.Class_definitions_are_automatically_in_strict_mode
  • Diagnostics.Modules_are
sqougxex

sqougxex2#

@orta指出,在尝试将+= 'foo'赋值给const字符串时,显示Diagnostics.Cannot_assign_to_0_because_it_is_a_constant
在JS中将会非常有用。

hgc7kmma

hgc7kmma3#

同样地,在定义之前使用的变量也对 let``/const 变量有帮助。

ki1q1bka

ki1q1bka4#

以下是从grammarErrorOnNode中调用的有关错误的详细列表。这不是所有的语法错误,但这是一个方便的方法将它们分类。检查器错误似乎更容易区分相关和不相关的错误,但也许那是因为我已经看过足够多的错误了。

此列表中有67个错误,从184个grammarErrorOnNode调用中产生。

  • Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies
  • Diagnostics.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression
  • Diagnostics.Cannot_find_name_0
class C {
    q = #unbound
    m() {
        #p++
        q++
        this.#q
        if (#po in this) {

        }
        const o = { a: 1, a: 2 }
        return o.a
    }
    #m() {
         this.#m = () => {}
    }
}
#unrelated

这些3个错误需要改进,但至少前两个应该在JS和TS中表现相同

  • Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable
class C {
    #m() {
         this.#m = () => {}
    }
}
  • Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies

junk.#m (你得到更好的错误如果C被定义,甚至更好如果C.#m被定义)

  • Diagnostics. _0_and_1_operations_cannot_be_mixed_without_parentheses
var x = 1 || 2 ?? 2
var x = 2 ?? 3 || 4
  • Diagnostics.For_await_loops_cannot_be_used_inside_a_class_static_block
class C {
    static {
        for await (const x of [1,2,3]) {
            console.log(x)
        }
    }
}
  • Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement
var b = true
switch (b) {
    case false:
        console.log('no')
    default:
        console.log('yes')
    default:
        console.log('wat')
}
  • Diagnostics.Duplicate_label_0
label: for (const x in [1,2,3]) {
    label: for (const y in [1,2,3]) {
        break label;
    }
}
  • Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause
try {
    throw 2
}
catch (e) {
    const e = 1
    console.log(e)
}
  • Diagnostics.Class_decorators_cant_be_used_with_static_private_identifier Consider_removing the experimental_decorator
declare var deco: any
@deco
class C {
    static #p = 1
}

但这不会在任何JS运行时上运行,所以可能不应该适用

  • Diagnostics.A_class_member_cannot_have

以下是翻译后的文本内容:

function outer(x) {
    break
}
  • 诊断信息:continue语句只能在封闭的迭代语句中使用;
function outer(x) {
    continue
}
  • 诊断信息:rest元素必须是解构模式中的最后一个元素;
const o = { e: 1, m: 1, name: "knee-deep" }
const { ...rest, e: a, m: n } = o
a + n
  • 诊断信息:rest元素不能有属性名;
const o = { e: 1, m: 1, name: "knee-deep" }
const { e: a, m: n, ...est: x } = o
a + n
  • 诊断信息:解构声明必须有初始化器;
const { e: a, m: n }
  • 诊断信息:const声明必须被初始化;
const a
  • 诊断信息:let不允许在let或const声明中作为名称使用;
let let = 12
  • 诊断信息:let声明只能在块内声明;
if (true)
  let c3 = 0
  • 诊断信息:const声明只能在块内声明;
if (true)
  const c3 = 0
  • 诊断信息:0不是关键字1的有效元属性,你是否想要2?
export let x = import.metal
  • 诊断信息:0不是关键字1的有效元属性,你是否想要2?
function foo() { new.targe }
  • 诊断信息:类不能有名为constructor的字段;
class C {
    "constructor" = 1
}
  • 诊断信息:动态导入只能接受模块说明符和一个可选的Assert作为参数;
const x = import()
const y = import('1', '2', '3')
  • 诊断信息:动态导入的参数不能是扩展元素。

相关问题