Skip to content
Advertisement

Typescript: Limit Return Value but not Parameter

I wish to pass in a function as a parameter but limit the passed function’s return type but not its parameters.

Ex: function Car(driver: Function), where driver can be ()=>boolean or (first, second) => boolean. The driver must take a function with return type boolean but have any number of parameters.

Advertisement

Answer

You can make use of generics.

FactoryFunction<T> specifies function type with arbitrary arguments, but a return type of T (or a subtype thereof).

Demo: https://repl.it/@chvolkmann/IdealisticLiveRelationaldatabase

abstract class Vehicle {} // abstract is optional
class Car extends Vehicle {}
class Truck extends Vehicle {}

type FactoryFunction<T> = (...args: any[]) => T

function importVehicle(factory: FactoryFunction<Vehicle>) {
  const vehicle = factory() // type: Vehicle
  console.log(vehicle)
}

importVehicle(() => new Car())
importVehicle(() => new Truck())

EDIT: You can also make the function itself generic.

function importSomething<T>(factory: FactoryFunction<T>) {
  const obj = factory() // type: T
  console.log(obj)
}

importSomething(() => new Car())
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement