typecript array.map потерял возвращаемый тип - PullRequest
0 голосов
/ 21 декабря 2018

Я ожидал бы ошибку типа в следующем коде, но для машинописного текста все в порядке, вы можете сказать мне, почему?

export interface Structure {
    aaa: string;
}

export function f1(): Structure[] {  // OK for typescript, not for me
    const result = [].map(certState => {
        return {
            aaa: 'aaa',
            ADDITIONAL_FIELD: 'asdf'
        }
    });

    return result;
}

export function f2(): Structure[] { // ERROR for typescript (and for me)
        return [
            {
                aaa: 'sdf',
                ADDITIONAL_FIELD: 'asdf'
            }
        ]
    }

Вот ссылка

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Я только что узнал, что Typescript имеет концепцию точных типов только для литералов объекта, поэтому f1 не использует литералы объекта, поэтому нельзя добавлять дополнительные свойства, и это допустимо для машинописи.f2 использует литералы объекта, поэтому дополнительные свойства не допускаются.Это очень пугает меня, но так работает машинопись

0 голосов
/ 22 декабря 2018

Ошибка связана с тем, что в f2() вы прямо возвращаете свой результат.

Если вы изменили f2() на

export function f2(): Structure[] {
    const returnVal = [
        {
            aaa: 'sdf',
            ADDITIONAL_FIELD: 'asdf'
        }
    ]

    return returnVal;
}

, то не будетошибка компилятора.

TypeScript использует структурную типизацию для определения совместимости типов, поэтому в вашем коде для f1(), result имеет тип

{
   aaa: string,
   ADDITIONAL_FIELD: string
}[]

, которыйсовместим с Structure[] (сужение типов не представляет опасности).

Я не уверен на 100%, почему прямой возврат не работает, но я предполагаю, что в f2() вы говорите компиляторучто "этот конкретный массив имеет тип Structure[]", и он говорит, что нет, это не так.Когда у вас есть промежуточная переменная в f1(), вы говорите «эта функция возвращает Structure[]», а когда вы возвращаете промежуточную переменную, компилятор проверяет и говорит «хорошо result соответствует Structure[]», поэтому эта функция делает то, что онаговорит.

Мне было бы интересно услышать, если бы у других было более строгое объяснение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...