#typescript #casting
Вопрос:
У меня есть следующая модель машинописного текста:
enum Metric {
COLOR = 'COLOR',
SIZE = 'SIZE'
};
interface Stats {
id: number;
metrics: {[key: number]: {[metricKey in Metric]?: number }};
}
Я пытаюсь разыграть некоторые объекты, чтобы Stats
:
const ok = {
id: 10
} as Stats;
const notOk = {
metrics: {
0: {
[Metric.COLOR]: 10
}
}
} as Stats;
Я не понимаю, почему первый вариант в порядке, но не второй.
Запуск TS2352 для ввода «Статистика» может быть ошибкой, поскольку ни один тип недостаточно совпадает с другим. Если это было сделано намеренно, сначала преобразуйте выражение в «неизвестно».
И если возможно, я хотел бы не использовать as unknown as Stats
Здесь типографская игровая площадка
Ответ №1:
Член id
ia отсутствует в notOk
. Этот код работает:
enum Metric {
COLOR = 'COLOR',
SIZE = 'SIZE'
};
interface Stats {
id: number;
metrics: {[key: number]: {[metricKey in Metric]?: number }};
}
const ok = {
id: 10
} as Stats;
const notOk = {
id: 1,
metrics: {
0: {
[Metric.COLOR]: 10
}
}
} as Stats;
Комментарии:
1. Хорошо, но почему тогда это работает в порядке (отсутствуют показатели)? Разве это не должно работать так же?
2. Это потому, что вы использовали приведение вместо спецификатора типа. Удалите слепок
ok
и запишите его какconst ok: Stat ...
. Это даст вам ожидаемую ошибкуmetrics
.3. Хорошо, но это не ответ на вопрос. Почему у нас есть 2 разных поведения при приведении с отсутствующими свойствами?
4. Это ничем не отличается от поведения. В обоих случаях
metrics
участник был проигнорирован. Первый случай удался, потому чтоid
был там, чего не было во второй части.5. Но почему во втором случае он не проигнорировал
id
, как проигнорировалmetrics
в первом случае?