Как помогает проверка лишнего имущества?

Для приведенного ниже кода

interface SquareConfig{
    color?: string;
    width?: number;
}

interface Square{
    color: string;
    area: number;
}

function createSquare(config: SquareConfig): Square {

    let newSquare:Square = {color: "white", area: 100};
    if (config.color) {
        newSquare.color = config.color;
    }
    if (config.width) {
        newSquare.area = config.width * config.width;
    }
    return newSquare;
}

Аргумент ниже (myObj), выведенный как тип any, может быть передан в качестве аргумента средством проверки типов во время компиляции. Код JS использует утиную печать во время выполнения.

let myObj = {colour: 'red', width: 100};

let mySquare = createSquare(myObj);

Во втором случае нижеприведенный аргумент (кроме типаSquareConfig) не может проходить проверку типа во время компиляции. Как упоминалось в руководстве: Литералы объектов обрабатываются особым образом и подвергаются избыточной проверке свойств при назначении их другим переменным или передаче их в качестве аргументов.

let mySquare = createSquare({colour: 'red', width: 100});

Какова цель проверки лишнего имущества во втором случае?


person overexchange    schedule 02.05.2018    source источник


Ответы (1)


Какова цель проверки лишнего имущества во втором случае?

Он правильно обнаруживает ошибки (как показано в данном случае, неправильное написание color), не создавая слишком большого количества ложных срабатываний.

Поскольку объект не имеет псевдонима где-либо еще, TypeScript может быть вполне уверен, что лишнее свойство не будет использоваться для другой цели в какой-либо другой части кода. То же самое нельзя сказать о myObj - мы, возможно, проверяем его только на предмет .width здесь, но затем используем его .colour в каком-то другом месте.

person Ryan Cavanaugh    schedule 02.05.2018
comment
Странно, что литерал объекта имеет лишнюю проверку свойств, но не объект myObj. Это почему? - person overexchange; 03.05.2018
comment
Поскольку объект не имеет псевдонима где-либо еще, TypeScript может быть вполне уверен, что лишнее свойство не будет использоваться для другой цели в какой-либо другой части кода. То же самое нельзя сказать о myObj - мы можем проверять его только на его .width здесь, но затем используем его .colour в каком-то другом месте. - person Ryan Cavanaugh; 03.05.2018
comment
В случае myObj вы знаете во время компиляции, что он имеет тип any, тогда как вы позволите передать его функции, которая принимает тип SquareConfig? - person overexchange; 03.05.2018
comment
myObj не относится к типу any. - person Ryan Cavanaugh; 03.05.2018
comment
Свойство colour в myObj делает его типом any. Не так ли? - person overexchange; 04.05.2018
comment
Нет; почему это так? Имеет предполагаемый тип { colour: string; width: number } - person Ryan Cavanaugh; 04.05.2018
comment
Если я явно не укажу тип как any в let myObj: any = {colour: 'red', width: 100};, компилятор TS будет рассматривать выведенный тип как { colour: string; width: number }. Это верно? - person overexchange; 04.05.2018