Home > Back-end >  Specify return type in Typescript
Specify return type in Typescript

Time:09-18

I wanna narrow down type when returning data from function smartly (hopefully without using if statement etc)

I have the following code

enum TypeData {
  Data1 = 'data1',
  Data2 = 'data2',
  Data3 = 'data3',
}

type DataType = {
  [TypeData.Data1]: {d1: number};
  [TypeData.Data2]: {d2: string};
  [TypeData.Data3]: {d3: number};
}

type Child = DataType[TypeData]

const dataType: DataType  = {
  [TypeData.Data1]: {d1: 1},
  [TypeData.Data2]: {d2: 2},
  [TypeData.Data3]: {d3: 3},
}

const getChild = (typeData: TypeData): Child => {
  return dataType[typeData]
}

const data = getChild(TypeData.Data2)

In the code, the function returns Child type, but Child type represents like

type Child = {
    d3: number;
} | {
    d1: string;
} | {
    d2: number;
}

instead of specific data type like { d3: number }. How to make it possible to specify the return data type instead of union of all types?

CodePudding user response:

You have to make use of TypeScript Generics in order to return the correct type depending on the given input. Like so:

enum TypeData {
  Data1 = 'data1',
  Data2 = 'data2',
  Data3 = 'data3',
}

type DataType = {
  [TypeData.Data1]: {d1: number};
  [TypeData.Data2]: {d2: number};
  [TypeData.Data3]: {d3: number};
}

const dataType: DataType  = {
  [TypeData.Data1]: {d1: 1},
  [TypeData.Data2]: {d2: 2},
  [TypeData.Data3]: {d3: 3},
}

const getChild = <T extends TypeData>(typeData: T): DataType[T] => {
  return dataType[typeData]
}

const data = getChild(TypeData.Data2)

See here

  • Related