Почему Typescript препятствует установке значений в null? - PullRequest
1 голос
/ 28 сентября 2019

Мне не понятны причины, не связанные со значениями NULL и флагом Typescript strictNullChecks.Я всегда устанавливаю значение переменной равным нулю, когда я уверен, что с ним покончено, чтобы освободить его из памяти, и GC может его собрать.Мои тесты показали, что это ускоряет выполнение кода JavaScript во много раз, особенно в длинных и глубоких циклах.Это плохая практика?Должны ли некоторые типы переменных иметь значение null, а другие нет?

Ответы [ 2 ]

2 голосов
/ 28 сентября 2019

Причина состоит в том, чтобы предотвратить некоторые ошибки во время выполнения, включая console.log(null.printWhyNullIsBad());, перехватывая эти ошибки во время компиляции, предполагая, что люди, которые пишут циклы настолько глубоко и настолько вложенно, что это расширяет возможности современных сборщиков мусора JS до их пределов, могут писатьтакого рода код в C / C ++ и запустить его с помощью WebAssembly.

1 голос
/ 28 сентября 2019

В большинстве случаев вам не нужно самостоятельно удалять значения переменных.Это может быть недостатком дизайна.Также обратите внимание, что если вы хотите удалить значение свойства объекта, может быть более целесообразно использовать это:

    delete myObject.attr;  // set 'undefined'

Я не понимаю причины, по которой не допускаются значения NULLTypescript и флаг 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

Playground

Этот код компилируетсятолько без strictNullChecks флага.В этом контексте при запуске кода возникает прекрасная ошибка: Uncaught TypeError: Cannot read property 'width' of null.

Проверьте функцию doSomething.Возвращает тип Sample, но без флага мы можем вернуть null.Проблема здесь в том, что когда мы вызываем эту функцию, возвращаемое значение будет обрабатываться как Sample => Существует несоответствие между типом и его реальным типом значения. Это огромная причина ошибок.

Мне нравится думать, что типизации TS должны отражать наилучшие реальные типы значений.

...