在“严格使用”之后寻找“更严格使用”

时间:2019-06-04 17:36:03

标签: javascript typescript

所以我总是在我的JavaScript代码中使用“严格”,但是我犯了一个愚蠢的错误。尽管“使用严格”捕获未用constlet定义的var,但对对象键却没有相同的作用。因此,我做了以下事情:

'use strict';

let foo = {
    update: ''
};

// and much later in the code
foo['udpate'] = 'This is what I have been working on lately';

不用说,在处理了大约300K文件之后,我得到的结果差强人意,也不知道为什么。

那么,我应该怎么做才能让JS警告我?我现在应该迁移到 TypeScript 吗? TS是否可以防止此类错误?

1 个答案:

答案 0 :(得分:3)

是的,Typescript在这里会有所帮助,尽管正如Brad在评论中指出的那样,这不是解决问题的唯一方法。

Typescript通过structural typing工作。如果您将类型添加到foo,它将告诉您update字段丢失:

let foo: UpdateHolder = {  // Fails because UpdateHolder is missing the property "update".
    udpate: 'This is what I have been working on lately'
};

如果不向foo添加类型,则当您尝试将foo分配给需要UpdateHolder的方法时,它将失败:

let foo = {  // Succeeds.
    udpate: 'This is what I have been working on lately'
};

processUpdate(foo);  // Fails because foo is not assignable to UpdateHolder;
                     // this is because it's missing the "update" property.

// This assumes that elsewhere processUpdate is defined as:
function processUpdate(updateHolder: UpdateHolder);
// or:
function processUpdate(updateHolder: {update: string});

但是,由于Javascript是一种灵活的语言,因此Typescript不会为您验证foo没有其他属性。它只会检查是否存在正确的属性,而不必检查是否存在不正确的属性。