Хотя верно, что модификатор readonly
TypeScript существует только в типе разработки и не влияет на код времени выполнения, это верно для всей системы типов. То есть ничто не мешает вам во время выполнения присвоить число переменной типа string
. Таким образом, этот ответ - своего рода красная сельдь ... если во время разработки вас предупреждают, что вы пытаетесь изменить что-то, помеченное как const
или readonly
, то это, возможно, устранит необходимость в расширенной проверке во время выполнения.
Но есть главная причина, по которой readonly
недостаточно. Существует нерешенная проблема с readonly
, которая заключается в том, что в настоящее время (по состоянию на TS3.4) типы, которые отличаются только своими атрибутами readonly
, взаимно назначаются. Который позволяет вам легко прорваться сквозь защитную оболочку readonly
любого имущества и связываться с внутренностями:
type Person = { name: string, age: number }
type ReadonlyPerson = Readonly<Person>;
const readonlyPerson: ReadonlyPerson = { name: "Peter Pan", age: 12 };
readonlyPerson.age = 40; // error, "I won't grow up!"
const writablePerson: Person = readonlyPerson; // no error?!?!
writablePerson.age = 40; // no error! Get a job, Peter.
console.log(readonlyPerson.age); // 40
Это очень плохо для readonly
. До тех пор, пока это не будет решено, вы, возможно, согласитесь с подателем предыдущего выпуска, который первоначально назвал проблему «модификаторы только для чтения - шутка» ?.
Даже если это разрешится, readonly
может не охватывать все варианты использования. Вам также необходимо пройти через все интерфейсы и типы в ваших библиотеках (или даже в стандартных библиотеках) и удалить методы, изменяющие состояние. Таким образом, все варианты использования Array
должны быть изменены на ReadonlyArray
, а все варианты использования Map
должны быть изменены на ReadonlyMap
и т. Д. После того, как вы это сделаете, у вас будет довольно безопасный способ представления неизменности , Но это много работы.
В любом случае, надеюсь, это поможет; удачи!