Сообщаем тип возврата функции с несколькими возможностями - PullRequest
0 голосов
/ 31 мая 2019

как TS может знать тип возвращаемых функций с множественным типом возврата, например:

type VariantA = Variant & {
    a: number,
    b: string,
    c: string[]
} 

type VariantB = Variant & {
    e: number,
    f: string,
    g: string[]
}

const CreateObject = (type: 'variantA' | 'variantB') => {
    if (type === 'variantA') {
        return { a: 5, b: 'hello', c: ['a', 'b'] } as VariantA
    } else {
        return { e: 5, f: 'hello', g: ['a', 'b'] } as VariantB
    }
}

Здесь было бы здорово, если бы редактор мог сказать, передал ли я 'optionA' в качестве типа, тогда тип возвращаемого значения - VariantA, иначе VariantB. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

А, я решил (но, может быть, есть лучшие альтернативы?)

Итак, я только что создал несколько перегрузок:

function CreateObject(type: 'typeA' | 'typeB'): VariantA
function CreateObject(type: 'typeA' | 'typeB'): VariantB
function CreateObject(type: 'typeA' | 'typeB'): VariantA | VariantB {
    if (type === 'typeA') {
        return { a: 1, b: '2', c: ['3', '4'] } as VariantA
    } else {
        return { e: 1, f: '2', g: ['3', '4'] } as VariantB
    }
}

Теперь TS выберет лучший вариант (надеюсь, lol)

0 голосов
/ 31 мая 2019

Вы можете создать два интерфейса и использовать тип Union для типа возврата.

interface VariantA{
  a: number,
  b: string,
  c: string[]
}

interface VariantB{
  e: number,
  f: string,
  g: string[]
}

type Variants = VariantA | VariantB;

const createObject = (type: string): Variants => {
  if (type === 'variantA') {
      return { a: 5, b: 'hello im variant A', c: ['a', 'b'] }
  } else {
      return { e: 5, f: 'hello im variant B', g: ['a', 'b'] }
  }
};

const objectA = createObject('variantA');
const objectB = createObject('variantB');
console.log(objectA);
console.log(objectB);
...