Не срабатывает проверка на типы данных

Есть объект с таким типом данных

export type JobType = {
    [index: string]: number | string | boolean;
    repeat: number;
    isWork: boolean;
    inQueue: boolean;
    jobName: string; 
    inQueueTime: number;
    isRunningTime: number;
}

Есть вот такой вот код:

//jobSettings - объект с типом данных JobType
let value: string | number = '';
if (typeof jobSettings[name] === 'number' || typeof jobSettings[name] === 'string') {
    value = jobSettings[name];
}

Выдает ошибку внутри if на переменной value: TS2322: Type 'string | number | boolean' is not assignable to type 'Key'. Type 'boolean' is not assignable to type 'Key'.

Почему, если я проверю тип на string и number, он это игнорирует и сравнивает с типами данных JobType?
Как это исправить?

Далее эта переменная будет подставлена в атрибут value тега <input>


Ответы (1 шт):

Автор решения: Alexey Ten

TS не умеет (пока?) сужать типы свойств объектов. Поэтому нужно сначала переложить его в переменную.

export type JobType = {
    [index: string]: number | string | boolean;
    repeat: number;
    isWork: boolean;
    inQueue: boolean;
    jobName: string; 
    inQueueTime: number;
    isRunningTime: number;
}

//jobSettings - объект с типом данных JobType
declare let jobSettings: JobType;
declare let name: string;

let value: string | number = '';

const v = jobSettings[name];

if (typeof v === 'number' || typeof v === 'string') {
    // Тут TS знает что `v` число или строка и присваивание не вызывает ошибки.
    value = v;
}

Playground

→ Ссылка