• Почему typescript не проверяет типы при использовании spread-оператора?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Потому что необходимое свойство value уже существует, а остальной мусор пофиг, т.к. в ts структурная типизация, т.е. под сигнатуру
    interface Props {
        readonly value: string;
    }
    подходит любой объект у которого есть value: string:
    const foo = {
        value: 'string',
        id: 'string'
    }
    const bar: Props = foo; // ok

    Как указал Alexandroppolus - проверка есть только при явном задании литерала:
    const bar: Props = {
        value: 'string',
        id: 'string' // err
    };
    Но это специальный случай - предполагается, что задавая литерал вы хотите задать именно объект указанного типа и никакой другого. Однако к парадигме структурной типизации используемой в ts это отношения не имеет, чисто quality of life фича.

    P.S. И да, это значит что в потенциале ты можешь сделать так:
    interface Props {
        readonly value: string;
    }
    interface Props2 {
        readonly value: string;
        readonly id?: number;
    }
    
    const foo = {
        value: 'string',
        id: 'string'
    }
    
    const bar: Props = foo; 
    const buz: Props2 = bar; 
    
    buz.id?.toFixed(2) // ts ok, runtime error :(
    Ответ написан
    Комментировать
  • Почему typescript не проверяет типы при использовании spread-оператора?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Потому что так миръ устроен. ts ругается на лишние свойства, только если ты передаешь в типизированную переменную объектный литерал с этими самыми лишними свойствами (тема раскрыта здесь). Главная задача ts при проверке объектов - ругаться, если чего-то не хватает или что-то не соответствует по типу.
    Ответ написан
    2 комментария