В функции, в чем разница между встроенным типом возвращаемого значения и типом возвращаемого значения, определенным в отдельном определении типа? - PullRequest
0 голосов
/ 11 января 2019

Я получаю противоречивое поведение, когда вставляю тип возвращаемого значения функции и определяю его в отдельном определении типа.

Например:

interface Foo {
    bar: string;
}

type Fooer = () => Foo;

const foo1: Fooer = () => { // It knows `.bar` should be a string
    return {
        bar: 123,
    };
}

// Return type set in a separate type definition
const foo2: Fooer = () => {
    return {
        foo: 123, // It doesn't complain about additional properties
        bar: "zzz",
    };
}

// Inline (repeated) return type
const foo3: Fooer = (): Foo => {
    return {
        foo: 123, // And now it does...
        bar: "zzz",
    };
}

Попробуйте на игровой площадке TypeScript

Я бы ожидал, что foo2 и foo3 будут вести себя одинаково (лично я ожидаю, что оба будут отображать одинаковую ошибку или, по крайней мере, быть последовательными).

Что мне здесь не хватает? В чем разница между обоими подходами?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Это связано с тем, как TypeScript обрабатывает литералы типа, а не с тем, является ли функция асинхронной или нет - если бы это были обычные функции, поведение было бы таким же.

Как правило, TypeScript позволяет существовать избыточным свойствам в объектах. Если объект имеет все необходимые свойства, остальное не имеет значения. Исключения - в значительной степени то, что вы обнаружили: литералы типов и явно определенные возвращаемые типы.

0 голосов
/ 11 января 2019

То, что происходит здесь, является результатом "типизированной печати" в TypeScript. Фактически, тот факт, что возвращаемый тип в foo2 имеет поле bar, являющееся строкой, означает, что функция имеет сигнатуру () => Promise<{foo: number, bar: string}>, которую можно назначить переменной foo2 типа Fooer из-за утки .

Однако в foo3 вы можете думать, что проверка типа применяется непосредственно к возвращаемому типу, а не ко всей функции. В результате вы видите ошибку Object literal may only specify known properties, and 'foo' does not exist in type 'Foo'., так как проверка типа выполняется над литералом объекта, который имеет дополнительное требование, что он не может указывать неизвестные свойства, когда вы даете ему явный тип.

...