programing

Typecript 인터페이스 내의 모든 속성 선택사항으로 설정

prostudy 2022. 3. 17. 00:53
반응형

Typecript 인터페이스 내의 모든 속성 선택사항으로 설정

응용 프로그램에 인터페이스가 있는 경우:

interface Asset {
  id: string;
  internal_id: string;
  usage: number;
}

포스트 인터페이스의 일부:

interface Post {
  asset: Asset;
}

또한 자산 객체가 부분적으로만 구성될 수 있는 포스트 드래프트용 인터페이스를 가지고 있다.

interface PostDraft {
  asset: Asset;
}

A을(를) 허용하고 싶다.PostDraft해당 속성의 유형을 계속 확인하는 동안 부분 자산 객체를 갖는 개체(그래서 단순히 다른 속성과 교환하는 것을 원하지 않음)any).

기본적으로 다음을 생성할 수 있는 방법을 원한다.

interface AssetDraft {
  id?: string;
  internal_id?: string;
  usage?: number;
}

완전히 재평가하지 않고Asset접점이렇게 할 방법이 있을까?그렇지 않다면, 이런 상황에서 내 타입을 정리하는 현명한 방법은 무엇일까?

이는 선택적 속성으로 추가 인터페이스를 생성하지 않고는 TypeScript < 2.1에서 가능하지 않지만, TypeScript 2.1+에서 매핑된 유형을 사용하면 가능하다.

이렇게 하려면Partial<T>기본적으로 TypeScript에서 제공하는 유형.

interface PostDraft {
    asset: Partial<Asset>;
}

이제 의 모든 속성이asset다음 작업을 수행할 수 있는 옵션:

const postDraft: PostDraft = {
    asset: {
        id: "some-id"
    }
};

정보Partial<T>

Partial<T>제공된 유형의 모든 속성을 선택적으로 만드는 매핑된 유형으로 정의된다(사용:?증표).

type Partial<T> = {
    [P in keyof T]?: T[P];
};

매핑된 유형에 대한 자세한 내용은 여기를 참조하고 핸드북을 참조하십시오.

딥 부분

개체에서 반복적으로 작동하는 부분 구현을 원하는 경우 TS 4.1+에서 다음 유형을 사용하십시오.

type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};

만약 내가 명시적인 것을 원하면AssetDraft인터페이스, I would need a combination ofextends그리고Partial:

interface Asset {
  id: string;
  internal_id: string;
  usage: number;
}

interface AssetDraft extends Partial<Asset> {}

인터페이스의 속성은 선택 사항이 아니며, 동일한 인터페이스를 선택 사항으로 한 번 사용할 수 없으며, 필수 항목으로 한 번 사용할 수 없다.

당신이 할 수 있는 것은 에 대한 선택적 속성이 있는 인터페이스를 갖는 것이다.AssetDraft다음 클래스에 대한 필수 속성이 있는 클래스Asset:

interface AssetDraft {
    id?: string;
    internal_id?: string;
    usage?: number;
}

class Asset {
    static DEFAULT_ID = "id";
    static DEFAULT_INTERNAL_ID = "internalid";
    static DEFAULT_USAGE = 0;

    id: string;
    internal_id: string;
    usage: number;

    constructor(draft: AssetDraft) {
        this.id = draft.id || Asset.DEFAULT_ID;
        this.internal_id = draft.internal_id || Asset.DEFAULT_INTERNAL_ID;
        this.usage = draft.usage || Asset.DEFAULT_USAGE;
    }
}

여기서 기본값은 정적 멤버지만 다른 방법으로 가져오거나 누락될 경우 오류를 발생시킬 수 있다.

나는 이 방법이 서버로부터 수신된 json(또는 유사한 것)으로 작업할 때, 인터페이스는 json 데이터를 나타내며 클래스는 json을 초기 값으로 사용하여 구성된 실제 모델이다.

데이비드 쉐레트 외에 어떻게 하면 내 쪽에서 몇 줄만 대답해 주지 않아도 바로 구현할 수 있는지.Partial<T>그 문제를 더 잘 이해하기 위해 타이프를 치다

interface IAsset {
  id: string;
  internal_id: string;
  usage: number;
}

interface IPost {
  asset: IAsset;
}

interface IPostDraft {
  asset: { [K in keyof IAsset]?: IAsset[K] };
}

const postDraft: IPostDraft = {
  asset: {
    usage: 123
  }
};

예를 들어, 빈 물체를 강제 캐스팅하는 것은 어떨까?

const draft = <PostDraft>{}
draft.id = 123
draft.internal_id = 456
draft.usage = 789

만약 당신이 정말로 이것이 필요하다면, 당신은 선택적 속성과 타이핑된 속성을 모두 만드는 템플릿으로부터 d.ts 인터페이스를 언제든지 생성할 수 있다.

Nitzan이 지적했듯이 Typecript 인터페이스 속성 중 하나는 선택 사항이거나 그렇지 않다.

참조URL: https://stackoverflow.com/questions/39713349/make-all-properties-within-a-typescript-interface-optional

반응형