Обычно мы можем использовать встроенные типы утилит 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