为什么 Typescript 不鼓励将值设置为 null?

scr*_*ter 5 javascript nullable typescript

我不明白不可为空类型和 Typescript 标志背后的推理strictNullChecks。当我确信我已经完成了变量的值以从内存中释放它并且 GC 可以收集它时,我总是将变量的值设置为 null。我的测试表明,它可以使 JavaScript 代码的执行速度提高很多倍,尤其是在长而深的循环中。这是一个不好的做法吗?是否应该将某些类型的变量设置为 null 而其他类型的变量不应该设置为 null?

Ric*_*dad 1

在大多数情况下,您不必自己删除变量值。这可能是一个设计缺陷。另请注意,如果要删除对象属性值,使用以下内容可能会更一致:

    delete myObject.attr;  // set 'undefined'
Run Code Online (Sandbox Code Playgroud)

我不明白不可为空类型和 Typescript 的 strictNullChecks 标志背后的推理。

要了解背后的逻辑,请检查此示例:

// strictNullChecks: false

interface Sample {
  color: string;
  width: number;
}

function doSomething(sample: Sample): Sample {
  if(sample.width > 10) {
    return null;
  }
  return sample;
}

const first: Sample = {
  color: 'red',
  width: 15
};

const second: Sample = doSomething(first);

console.log(second.width);  // Uncaught TypeError: Cannot read property 'width' of null

Run Code Online (Sandbox Code Playgroud)

操场

此代码仅在没有strictNullChecks标志的情况下编译。在这种情况下,当代码运行时,我们会遇到一个漂亮的错误:Uncaught TypeError: Cannot read property 'width' of null

检查功能doSomething。它返回一个Sample类型,但没有标志我们可以返回null。这里的问题是,当我们调用这个函数时,返回的值将被操作为Sample=>类型与其真实值类型之间存在不一致。这是导致错误的一个重要原因。

我认为 TS 类型必须反映最佳的实际值类型。