在使用Google Closure Compiler进行测试时,我发现一个例子中无法强制编译器对错误变量类型进行警告。我使用了以下示例:
而且代码编译完美,没有给出预期类型的警告。但是如果您使用:
您会收到预期的类型不匹配警告。
我理解这可能是因为`push`没有定义类型检查,因为它是一个内置函数。预期定义`pending`作为`pendingItem`数组可以强制执行,但默认情况下并不会强制执行。
问题是是否以及如何向已定义的函数(如`push`)添加类型检查,以便在上面的示例中发出警告。我也了解到,为了实现类似的结果,一种方法是在`dummyItem`之前添加`/** @type {pendingItem} */`来强制类型,但出于教育目的,我想知道如何向像`push`这样的函数添加类型检查(或者更严格地定义`pending`本身)。
此外,有人能解释一下重命名对象属性的逻辑吗?如果编译上面的示例,它不会重命名`dummyItem`的属性`name`,但它会将`token`重命名为`a`。
/** @typedef ({name: string, token: string}) */
var pendingItem;
/** @type (Array.<pendingItem>) */
var pending = [];
// NOTICE: the token is intentionally misspelled as "toke" to cause a warning
var dummyItem = {
name: 'NameHere',
toke: 'SomeToken'
};
// This should cause a warning, because of the
// type mismatch (toke instead of token)
pending.push(dummyItem);
// Do something useful so that the whole code wouldn't be optimized to 0 bytes
alert(pending.length);
而且代码编译完美,没有给出预期类型的警告。但是如果您使用:
pending[1] = {
name: 'Second Name',
toke: 'Second Token'
}
您会收到预期的类型不匹配警告。
我理解这可能是因为`push`没有定义类型检查,因为它是一个内置函数。预期定义`pending`作为`pendingItem`数组可以强制执行,但默认情况下并不会强制执行。
问题是是否以及如何向已定义的函数(如`push`)添加类型检查,以便在上面的示例中发出警告。我也了解到,为了实现类似的结果,一种方法是在`dummyItem`之前添加`/** @type {pendingItem} */`来强制类型,但出于教育目的,我想知道如何向像`push`这样的函数添加类型检查(或者更严格地定义`pending`本身)。
此外,有人能解释一下重命名对象属性的逻辑吗?如果编译上面的示例,它不会重命名`dummyItem`的属性`name`,但它会将`token`重命名为`a`。