1 분 소요

제약 조건과 다르게 타입 구현 영역에서 사용하는 extends는 상함연산자를 사용이 가능하다!! 이른 조건부 타입이라고 한다

T extends U ? X : Y

이런식으로 사용한다

type IsString<T> = T extends string ? true : false;
type A = IsString<string>; // true
type B = IsString<number>; // false

타입구현 사용

type U = string | number | boolean;

type MyType<T> = T extends U ? true : false;

interface IUser<T> {
    name: string
    age: T extends U ? number : never
}


// `T`는 `boolean` 타입으로 제한.
interface IUser<T extends boolean> {
  name: string,
  age: T extends true ? string : number, // `T`의 타입이 `true`인 경우 `string` 반환, 아닌 경우 `number` 반환.
  isString: T
}

const str: IUser<true> = {
  name: 'Neo',
  age: '12', // String
  isString: true
}
const num: IUser<false> = {
  name: 'Lewis',
  age: 12, // Number
  isString: false
}

// test
   type NumberAndString = number | string
    interface IdLabel {
        id: number /* some fields */;
    }
    interface NameLabel {
        name: string /* other fields */;
    }
    type NameOrId<T extends NumberAndString> = T extends number ? IdLabel : NameLabel;
    function createLabel<T extends NumberAndString>(idOrName: T): NameOrId<T> {
        throw "unimplemented";
    }

    let a = createLabel(1)
    let b = createLabel("typescript")
    let c = createLabel(Math.random() ? "hello" : 42)


참고 참고