programing

Typescript 3.0에서 Tuple을 다른 Tuple 유형으로 '매핑'하는 방법

iphone6s 2023. 7. 11. 21:38
반응형

Typescript 3.0에서 Tuple을 다른 Tuple 유형으로 '매핑'하는 방법

의 태플을 가지고 있습니다.Maybe유형:

class Maybe<T>{ }

type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];

그리고 저는 이것을 여러 가지 유형으로 바꾸고 싶습니다.

type TupleIWant = [string, number, boolean];

그래서 저는 이것을 시도했습니다:

type ExtractTypes<T> = T extends Maybe<infer MaybeTypes>[] ? MaybeTypes : never;

type TypesArray = ExtractTypes<MaybeTuple>; // string | number | boolean NOT [string, number, boolean]

효과가 없는 것 :-(

알겠습니다(string | number | boolean)[]내가 원하는 튜플보다는:[string, number, boolean]

제가 하고 싶은 일이 현재 가능한가요?

TypeScript 3.1에서 지원되는 매핑된 튜플 유형을 사용해야 합니다.

속성이 있는 매핑된 유형을 만들 수 있습니다.0,1,2그리고.length다음과 같은 올바른 유형:

class Maybe<T> {}

type MaybeTuple = [Maybe<string>, Maybe<number>, Maybe<boolean>];

type MaybeType<T> = T extends Maybe<infer MaybeType> ? MaybeType : never;
type MaybeTypes<Tuple extends [...any[]]> = {
  [Index in keyof Tuple]: MaybeType<Tuple[Index]>;
} & {length: Tuple['length']};

let extractedTypes: MaybeTypes<MaybeTuple> = ['hello', 3, true];

이전 버전의 유형 스크립트를 사용하는 경우 TypeScript의 릴리스되지 않은 버전을 사용하거나 해결 방법으로 조건부 유형을 작성하여 튜플과 일치시킬 수 있습니다. 예를 들어, 이렇게 할 있습니다.

배열의 비인덱스 키를 제외해야 합니다. 그렇지 않으면 다음을 매핑할 수도 있습니다.push,length기타:

type NumStrDate = [number, string, Date]
type IdxOf<T extends any[]> = Exclude<keyof T, keyof any[]>
type OrUndef<T extends any[]> = {[K in IdxOf<T>]: T[K] | undefined}
type MaybeNSD = OrUndef<NumStrDate>

const fine: MaybeNSD = [5, 'foo', undefined]
const problem: MaybeNSD = ['foo', undefined, undefined]

위에 마우스를 올려놓으면MaybeNSD해결된 의미가 표시됩니다.

type MaybeNSD = {
    0: number | undefined;
    1: string | undefined;
    2: Date | undefined;
}

놀이터 링크

언급URL : https://stackoverflow.com/questions/51672504/how-to-map-a-tuple-to-another-tuple-type-in-typescript-3-0

반응형