Generi c Объект Param как его литерал - PullRequest
1 голос
/ 13 апреля 2020

У меня есть простая функция, которая принимает обобщенный c объект. Тип возвращаемого значения должен быть таким же, как у этого объекта, но сужен аналогично тому, как работают as const утверждения. Например,

. Следующее должно иметь тип возврата { a: "first"; b: "second" }, а не { a: string; b: string }:

myFn({ a: "first", b: "second" });

Существует ли механизм, с помощью которого мы можем проинструктировать средство проверки типов, что тип возврата myFn является его первым тип аргумента, суженный?

1 Ответ

1 голос
/ 13 апреля 2020

Тип возвращаемого значения должен быть таким же, как у этого объекта, но сужен аналогично тому, как работают константные утверждения.

Этого можно достичь, передав тип в качестве параметра типа функция.

function myFn<T>(args): T {
  // do stuff
  return null;
}

const a = myFn<{ a: "first"; b: "second" }>(args);

enter image description here

type MyObj = { a: "first", b: "second" }
const a = myFn<MyObj>(args);

К сожалению, объект должен быть полностью определен во время компиляции, поскольку типы недоступны во время выполнения.

Старый ответ (неверно истолкован)

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

function MyFunction<T>(argument1: T, anotherArg: number): T {
  // do stuff
}

// result will be of type User
const result = MyFunction<User>(user, 9);

В некоторых случаях вы можете просто сделать.

// user must be defined as type User above somewhere
const result = MyFunction(user, 9);
...