В этом примере используется console.log
для проверки предполагаемых типов. console.log
не заботится о типе аргумента, поэтому в обоих случаях ошибок нет.
Результат отличается, если для теста требуется более конкретный тип:
// Altered getShapes function
function getShapes() {
const result = [
{ kind: "circle", radius: 100 },
{ kind: "square", sideLength: 50 },
];
return result;
}
for (const shape of getShapes()) {
if (shape.kind === "circle") {
const radius: number = shape.radius;
} else {
const length: number = shape.sideLength;
}
}
При включенном --strictNullChecks
вы получите две ошибки:
t.ts:25:11 - error TS2322: Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
25 const radius: number = shape.radius;
~~~~~~
t.ts:29:11 - error TS2322: Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
29 const length: number = shape.sideLength;
~~~~~~
Как было объявлено для этой функции, ошибок нет, когда утверждение as const
используется, чтобы компилятор выводил точный тип.
Для справки вот тип, выведенный для типа возврата getShapes()
с объявлением const
:
( { kind: string; radius: number; sideLength?: undefined; }
|{ kind: string; sideLength: number; radius?: undefined; } ) []
Как видите, kind
расширен до string
, а тип элемента массива представляет собой объединение с элементами, у которых объявлены все свойства, только некоторые из них являются необязательными в некоторых членах объединения - поэтому вы не получаете ошибок например, в журнале консоли, когда вы регистрируетесь, shape.radius
- console.log
с удовольствием зарегистрирует undefined
, если член объединения имеет неправильный тип.
Вот тип, выведенный для возвращаемого типа getShapes()
с as const
утверждением:
readonly [
{ readonly kind: "circle"; readonly radius: 100; },
{ readonly kind: "square"; readonly sideLength: 50; }
]
Теперь это тип кортежа только для чтения, а не массив, и он имеет точные типы для каждого члена кортежа (и, как и ожидалось, kind
является правильным литеральным типом).