programing

유형에서 속성 제외

goodsources 2023. 3. 12. 10:45
반응형

유형에서 속성 제외

유형에서 단일 자산을 제외하려고 합니다.내가 어떻게 그럴 수 있을까?

예를 들면,

interface XYZ {
  x: number;
  y: number;
  z: number;
}

그리고 나는 재산을 제외시키고 싶다.z갖기 위해

type XY = { x: number, y: number };

3.5 이상의 TypeScript 버전인 경우

TypeScript 3.5에서는 표준 라이브러리에 유형이 추가되었습니다.사용 방법에 대해서는, 다음의 예를 참조해 주세요.

3.5 이전 버전의 TypeScript의 경우

TypeScript 2.8에서는Exclude타입이 표준 라이브러리에 추가되어 생략 타입을 다음과 같이 간단하게 쓸 수 있습니다.

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

TypeScript 버전이 2.8 미만인 경우

를 사용할 수 없습니다.Exclude2.8보다 낮은 버전을 입력하지만 위와 같은 종류의 정의를 사용하기 위해 대체 버전을 생성할 수 있습니다.단, 이 대체는 문자열 유형에서만 작동하기 때문에 다음과 같이 강력하지 않습니다.Exclude.

// Functionally the same as Exclude, but for strings only.
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>

사용 중인 유형의 예는 다음과 같습니다.

interface Test {
    a: string;
    b: number;
    c: boolean;
}

// Omit a single property:
type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}

// Or, to omit multiple properties:
type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}

생략...

단일 재산

type T1 = Omit<XYZ, "z"> // { x: number; y: number; }

다중 특성

type T2 = Omit<XYZ, "y" | "z"> // { x: number; } 

조건부로 속성

예: 모든 문자열 유형:

type Keys_StringExcluded<T> = 
  { [K in keyof T]: T[K] extends string ? never : K }[keyof T]

type XYZ = { x: number; y: string; z: number; }
type T3a = Pick<XYZ, Keys_StringExcluded<XYZ>> // { x: number; z: number; }

매핑 유형(PR)에 TS 4.1 키 재매핑 / 이 있는 더 짧은 버전:

type T3b = { [K in keyof XYZ as XYZ[K] extends string ? never : K]: XYZ[K] } 
// { x: number; z: number; }

의 속성string양식

예: exclude getters('get' 문자열 접두사 포함)

type OmitGet<T> = {[K in keyof T as K extends `get${infer _}` ? never : K]: T[K]}

type XYZ2 = { getA: number; b: string; getC: boolean; }
type T4 = OmitGet<XYZ2> //  { b: string; }

주의: 위의 템플릿리터럴 타입은 TS 4.1에서 지원됩니다.글씨를 쓸 수도 있습니다. get${string}대신get${infer _}여기서.

기타 정보

Pick,Omit기타 유틸리티 유형

Typescript를 사용하여 특정 키를 선택하고 이름을 변경하는 방법(제외가 아닌 생략)

놀이터.

타이프스크립트 2.8에서는 새로운 빌트인을 사용할 수 있습니다.Excludetype. 2.8 릴리즈 노트는 "사전 정의된 조건부 유형" 섹션에서 실제로 이를 언급하고 있습니다.

주의: 제외 유형은 여기서 제안하는 Diff 유형의 적절한 구현입니다. [...] 생략 유형은 다음과 같이 기술되어 있으므로 포함하지 않았습니다.Pick<T, Exclude<keyof T, K>>.

이를 예제에 적용하면 XY 유형은 다음과 같이 정의할 수 있습니다.

type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>

몇 가지 변수를 선언하고 확산 연산자를 사용하여 유형을 추론하는 솔루션을 찾았습니다.

interface XYZ {
  x: number;
  y: number;
  z: number;
}

declare var { z, ...xy }: XYZ;

type XY = typeof xy; // { x: number; y: number; }

효과는 있지만, 더 나은 해결책을 찾고 싶습니다.

타입스크립트 3.5+에서는:

interface TypographyProps {
    variant: string
    fontSize: number
}

type TypographyPropsMinusVariant = Omit<TypographyProps, "variant">

라이브러리를 사용하는 경우는, ts-essentials 를 사용합니다.

import { Omit } from "ts-essentials";

type ComplexObject = {
  simple: number;
  nested: {
    a: string;
    array: [{ bar: number }];
  };
};

type SimplifiedComplexObject = Omit<ComplexObject, "nested">;

// Result:
// {
//  simple: number
// }

// if you want to Omit multiple properties just use union type:
type SimplifiedComplexObject = Omit<ComplexObject, "nested" | "simple">;

// Result:
// { } (empty type)

추신: 그 밖에도 도움이 되는 물건이 많이 있습니다.

타입스크립트 3.5

Typescript 3.5 에서는 Oscript 도우미가 포함됩니다.TypeScript 3.5 RC - 생략 도우미 유형

직접 사용할 수 있으며 업데이트 시 Oscit 도우미에 대한 사용자 정의도 제거해야 합니다.

난 그렇게 생각해:

interface XYZ {
  x: number;
  y: number;
  z: number;
}
const a:XYZ = {x:1, y:2, z:3};
const { x, y, ...last } = a;
const { z, ...firstTwo} = a;
console.log(firstTwo, last);

언급URL : https://stackoverflow.com/questions/48215950/exclude-property-from-type

반응형