Вывод типа интерфейса - PullRequest
       19

Вывод типа интерфейса

0 голосов
/ 01 июня 2018

У меня есть следующие типы:

interface A { a: string }
interface B extends A { b: string }
interface C extends A { c: string }

Теперь я хочу написать следующую функцию, которая возвращает A:

function test(t: number): A {
    return t > 10
        ? { a: "a", b: "b" }
        : { a: "a", c: "c" };
}

Это работает, только если я явно приведувозвратил объекты в A, B или C, или если я создаю отдельные функции, которые явно возвращают либо B, либо C, и использую их для построения объекта.

Есть лиВ любом случае компилятор может сделать вывод, что возвращаемый объект на самом деле является B или C и, следовательно, также A, без необходимости указывать это?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Похоже, что TypeScript не выводит тип объекта, который определен интерфейсом.

Предполагаемый тип { a: "a", b: "b" } равен { a: string, b: string }, который может использоваться везде, где A илиB можно использовать, но это не A и B, это другой тип.

Так что ответ: нет, компилятор не выведет A или B,он выведет что-то еще, и приведение необходимо, если желаемый тип - A или B.

0 голосов
/ 01 июня 2018

Насколько я понимаю, это потому, что TypeScript налагает дополнительные ограничения на литералы объектов в отношении избыточных свойств.Если он переписан так, ошибка отсутствует:

interface A { a: string }
interface B extends A { b: string }

function test(): A {
    const result = { a: "a", b: "b" };
    return result;
}

Также есть опция компилятора suppressExcessPropertyErrors .

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