Как расширить возвращаемый тип функции, передающей тип параметра? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь определить интерфейс, расширяющий свойства из возвращаемого типа существующей функции. Но тип возвращаемого значения функции определяется типом параметра. Что-то вроде кода ниже:

function doSomething<T: any>(myParameter: T): { myProperty: T };
interface MyInterface<A> extends ReturnType<typeof doSomething<A>> {
  newProperty1: boolean;
  newProperty2: boolean;
}

Затем, когда я использую интерфейс, я хотел бы вывести тип параметра функции, например

let something: MyInterface<number>;

, что приведет к типу например

{
  myProperty: number,
  newProperty1: boolean,
  newProperty2: boolean,
}

Как я могу этого добиться?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

К сожалению, я не думаю, что вы можете повторно использовать подпись doSomething. В качестве обходного пути вы можете переопределить его, используя интерфейс.

interface MyCallSignature<T> {
  (myParameter: T): {
    myParameter: T
  }
}

interface MyInterface<T> extends ReturnType<MyCallSignature<T>> {
  newProperty1: boolean;
  newProperty2: boolean;
}

declare let something: MyInterface<number>;

something.myProperty; // number
something.newProperty1; // boolean
something.newProperty2; // boolean
0 голосов
/ 28 мая 2020

Изменить:

function doSomething<T extends any = {}>(myParameter: T): { myProperty: T } {
  return { myProperty: myParameter }
}

type DoSomething<T> = typeof doSomething
type MyInterface<A extends any = {}> = ReturnType<DoSomething<A>> & {
  newProperty1: boolean
  newProperty2: boolean
}

const something: MyInterface<number> = {
  myProperty: 1,
  newProperty1: true,
  newProperty2: false
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...