如何使打字稿在失败的非空断言上抛出运行时错误?

How to make typescript throw runtime error on failed non-null assertion?

是否有设置使 typescript 将非空断言编译为 javascript 并引发错误?

默认情况下,非空断言被丢弃(playground):

// Typescript:
function foo(o: {[k: string]: string}) {
    return "x is " + o.x!
}
console.log(foo({y: "ten"}))

// Compiled into this js without warnings:
function foo(o) {
    return "x is " + o.x;
}
console.log(foo({ y: "ten" }));
// output: "x is undefined"

我想要一个设置或扩展或使其编译成这个的东西:

function foo(o) {
    if (o.x == null) { throw new Error("o.x is not null") }
    // console.assert(o.x != null) would also be acceptable
    return "x is " + o.x;
}

有什么方法可以将非空感叹号断言转换为 javascript 断言或错误吗?

没有。

非空断言专门告诉编译器比它知道的更多。它纯粹是一种用于管理类型信息的结构。但是,如果您对编译器的了解不多,那么您将不得不自己处理它。

为了类型安全,最好完全避免使用此功能(除了极少数情况,您可以 100% 确定该值不为空),eslint 甚至还提供了一些帮助让您知道它是在 no-non-null-assertion rule

中很危险

我想,好消息是,如果您断言该值不为空,但它是空的,那么您的程序可能最终会在某个地方崩溃...

一种选择是使用 macro-ts 之类的方法将您自己的代码编写为宏。像这样的功能永远不会出现在打字稿中,因为该项目专门针对构建时(静态)类型检查,正如 Alex Wayne 所解释的那样。