Почему следующее общее ограничение вызывает ошибку компилятора? - PullRequest
0 голосов
/ 31 января 2019

Следующая ограниченная универсальная функция ...

interface Alpha
{
    member1: number,
    member2: string,
}

interface Beta
{
    member1: string,
    member2: string,
}

function convert<Source extends Alpha, Target extends Beta>(s: Source): Target
{
    return {
        ...s,
        member1: s.member1.toString(),
    };
}

const a: Alpha = {member1: 12, member2: 'hello'};
const b: Beta  = convert(a);

... создает этот компилятор error (где строка 16 - начало оператора return):

main.ts:16:5 - error TS2322: Type 'Source & { member1: string; }'
               is not assignable to type 'Target'

Конечно, если я выполняю работу компилятора и вручную создаю определенную версию универсальной функции, то она работает, как и ожидалось, без предупреждений или ошибок:

function convert(a: Alpha): Beta
{
    return {
        ...a,
        member1: a.member1.toString(),
    };
}

Итак, мои вопросы:

  • Почему приведенное выше определение не работает должным образом?
  • И как выразить такое ограничение в другомпуть, чтобы он скомпилировал?

Версия компилятора: 3.2.2

1 Ответ

0 голосов
/ 22 февраля 2019

Target, являясь расширением Beta, может иметь любое количество новых полей, которые вы не будете возвращать - вы просто возвращаете Source с измененным полем.

ВозможноИсправить можно было бы изменить convert's подпись, чтобы соответствовать реализации:

  function convert<Source extends Alpha>(s: Source): Beta & { member1: string } {}

имейте в виду, что в любом случае вы не сможете сделать спред из универсального типа (релевантный TSвыпуск )

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