Тип, обусловленный общим типом

#typescript #typescript-typings #typescript-generics

#typescript #typescript-типизации #typescript-generics

Вопрос:

Мне было интересно, возможно ли что-то подобное в TypeScript:

 type Something = {...}

interface A extends Something {...}
interface B extends Something {...}

interface MyInterface<T extends Something> {
    method(): T
    anotherMethod(): number | number[]
}
  

Тип, возвращаемый, anotherMethod() зависит от общего, что означает:

  • если T — тип A, то anotherMethod() => number
  • если T является типом B, то anotherMethod() => number[]

Например.

 const myObjA: MyInterface<A> = {}
myObjA.anotherMethod() // ==> returns a number

const myObjB: MyInterface<B> = {}
myObjB.anotherMethod() // ==> returns an array
  

Имеет ли смысл вопрос?

Заранее спасибо, Фрэн

Ответ №1:

Конечно, для этого вы можете использовать условные типы.

 interface MyInterface<T extends Something> {
    method(): T
    anotherMethod(): T extends A ? number : number[]
}

declare const myObjA: MyInterface<A>
const a = myObjA.anotherMethod() // number

declare const myObjB: MyInterface<B>
const b = myObjB.anotherMethod() // number[]
  

Комментарии:

1. Отлично !!, да, это определенно отвечает на мой вопрос. Большое спасибо. Я не знал об условных типах.