Как получить возвращаемое значение типа функции, которая наследует интерфейс типа basi c - PullRequest
0 голосов
/ 30 апреля 2020

Обычно мы можем использовать встроенные типы утилит ReturnType для получения возвращаемого значения типа функции, например:

interface A {
  (...args: any): string
}

type Return = ReturnType<A> // Return will be 'string'

Теперь мы используем новый тип B для наследования A

interface A {
  (...args: any): any
}

interface B extends A {
  (config: Record<string, string>): Promise<void>
}

type Return = ReturnType<B> // Return will be 'any' instead of 'Promise<void>'

Возвращаемое значение не соответствует моим ожиданиям, и я никак не могу определить тип возвращаемого значения B.

Я пытался реализовать инструмент, подобный ReturnType вот так:

type ReturnPromisedType<T extends (...args: any) => any> = T extends (...args: any) => Promise<infer R> ? R : never;

Тип A всегда совместим с условными типами, а any используется для сопоставления Promise <infer P>, чтобы сделать вывод, что P равно unknown

1 Ответ

0 голосов
/ 30 апреля 2020

Если вы присмотритесь к определению ReturnType, вы найдете ответ:

type ReturnType<T extends (...args: any) => any> =
    T extends (...args: any) => infer R ? R : any;

Typescript выводит ваш возвращаемый тип интерфейса (то есть R = any) и, таким образом, возвращает любой для A. Для расширения с B extends A Патрик Робертс объяснил объединение в комментариях.

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