Неверное назначение типа только для чтения - PullRequest
1 голос
/ 12 апреля 2020

Я наткнулся на то, о чём я не уверен, что происходит. Рассмотрим следующий код:

interface T1 { value: number }
interface T2 { readonly value: number }

const t2: T2 = { value: 0 }
t2.value += 1
const t1: T1 = t2
t1.value += 1

Почему t2 можно присвоить t1? С TypeScript 3.7+ (возможно, также более ранними версиями, но я не тестировал) все, кроме t2.value += 1 компилируется Если бы t2 действительно было доступно только для чтения во время выполнения, как показано ниже, это вызвало бы ошибку времени выполнения.

interface T { value: number }

const t2 = Object.freeze({ value: 0 })
const t1: T = t2
t1.value += 1

1 Ответ

0 голосов
/ 12 апреля 2020

Вот код js, который соответствует вашему первому фрагменту:

var t2 = { value: 0 };
// t2.value += 1
var t1 = t2;
t1.value += 1;

А вот для второго:

var t2 = Object.freeze({ value: 0 });
var t1 = t2;
t1.value += 1;

Readonly используется только используется во время компиляции, но теряется при переносе в js, поэтому никакая ошибка времени выполнения

U не может выполнить назначение, потому что вы указали тип в t1. t2 обладал необходимыми свойствами для правильного назначения, но value в T1 не доступен только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...