Проблема приведения машинописного текста с картой перечисления

#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 в первом случае?