TypeScript不会在运行时进行类型检查。

5

我是一个 TypeScript 的初学者,正在 Playgound 网站上尝试使用它。我有以下的代码:

class Queue<T> { 
    private data = [];

    push = (item: T) => this.data.push(item);
    pop = (): T => this.data.shift();
}



let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function () {
    let q = new Queue<number>();
    q.push("asdada");

    alert(q.pop(0));
}

document.body.appendChild(button);

您可以看到,我创建了一个队列对象来接受数字。然而,我能够传递字符串并在浏览器上弹出它。我查看了编译后的JS版本,它没有对我的变量进行类型检查。TypeScript不是应该避免这些错误吗?或者我错了吗?

谢谢!


1
TypeScript 仍会输出常规的 JavaScript,因此如果它是有效的 JavaScript,则仍将继续工作。它只会在您使用的编辑器中向您发出警告。 - agDev
那么基本上,它的类型检查优势只针对开发而言? - iamjc015
它仍然可以成功编译吗? - iamjc015
没错。 - agDev
2个回答

6

3
好的,如果你不想在出现类型错误时生成 JavaScript 代码,可以使用 --noEmitOnError - Matt McCutchen
1
由于Typescript编译成纯Javascript,即使在编译时看到错误,只要Javascript逻辑有效,它就能正常工作。因为你将运行的是Javascript代码而不是Typescript代码。 - Plochie
1
不,如果有正确的构建设置,它不应该让你编译存在类型问题的代码。理想情况下,您应该使用linting工具,以便实时指出这些错误。好处并不仅限于开发阶段,是的,类型检查只在开发过程中起作用,并且在转换为JavaScript后,类型检查不会被强制执行,但这意味着您开发的内容不太可能存在与类型相关的问题,因为它不允许您编写具有危险做法的代码,例如假定对象属性或变量的数据类型。 - Jayce444
1
是的,如果检测到任何TS错误,该配置选项应该可以防止创建JavaScript输出。 - Jayce444
2
关于是否使用noEmitOnError:这取决于你的开发工作流程。有时你可能会发现编写代码时还未确定正确类型很有用,可以在运行时测试代码,然后添加类型直到错误消失。使用noEmitOnError,在你测试任何东西之前,你必须添加一堆转换类型,然后在代码审查期间记得将它们删除。重要的是不要将带有错误的代码检入到主分支中。 - Matt McCutchen
显示剩余3条评论

3
Typescript仍将输出常规javascript,因此如果它是有效的javascript,则它将继续工作。它只会在您使用的编辑器中向您发出警告。
如果您希望typescript在出现错误时不生成javascript,请像Matt McCutchen在评论中建议的那样使用--noEmitOnError
如果您想在运行时检查类型,则可以使用用户定义的类型保护
有关快速示例,请参见this答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接