TypeScript: Тип 'строка | undefined 'нельзя назначить типу' string ' - PullRequest
2 голосов
/ 10 апреля 2020
interface SomeType {
  a: string;
  b?: string;
}

const foo: SomeType = {
  a: 'hello',
  b: 'there'
};

const bar: SomeType = {
  a: 'hello'
};
bar.b = 'there';

// Error on this line
const str: string = foo.b;

// These lines have no error
const str2: string = foo.b ? foo.b : '';
const str3: string = foo.b!;
const str4: string = bar.b;

В приведенном выше примере у нас есть 2 варианта создания объекта SomeType, который имеет необязательное свойство b. При объявлении foo мы устанавливаем значение b при создании объекта. Для bar мы устанавливаем значение b после создания объекта.

При создании первой строки str возникает ошибка:

Тип 'строка | undefined 'нельзя назначить типу' string '. Тип 'undefined' нельзя назначить типу 'string'.ts (2322)

Эта ошибка смягчается с помощью подходов для str2 и str3. Я понимаю, что в этих примерах мы либо проверяем значение foo.b, либо утверждаем, что знаем, что foo.b имеет значение.

Я не понимаю, почему ошибка не появляется, когда str4 создано. Почему TypeScript способен обнаружить, что bar.b - это , а не undefined, но он не смог обнаружить то же самое для foo.b? Каково то, как мы устанавливаем свойство, которое приводит к этой ошибке?

(TypeScript Version 3.8.2)

1 Ответ

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

Удаление SomeType из строки const foo: SomeType = ... заставит код работать.

interface SomeType {
  a: string;
  b?: string;
}

const foo = {
  a: 'hello',
  b: 'there'
};

const bar: SomeType = {
  a: 'hello'
};
bar.b = 'there';

// No more error on this line
const str: string = foo.b;

// These lines have no error
const str2: string = foo.b ? foo.b : '';
const str3: string = foo.b!;
const str4: string = bar.b;

В исходном коде вы преобразуете объект { a:..., b:...} в interface. В этом случае SomeType:

const foo: SomeType = {
  a: 'hello',
  b: 'there'
};

Простейшим примером этого будет, если вы измените последнюю строку для str4, чтобы добавить приведение, вы получите ту же ошибку:

const str4: string = (bar as SomeType).b; // error, because of the cast
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...