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 인터페이스 속성 중 하나는 선택 사항이거나 그렇지 않다.
'programing' 카테고리의 다른 글
Vuetify에서 사용자 지정 SVG 아이콘을 추가하는 방법 - Vue (0) | 2022.03.17 |
---|---|
관찰 가능한 캐스팅 결과.각 2에서 각 유형별로 포크조인 (0) | 2022.03.17 |
TypeScript에서 가져온 유형의 주변 선언 (0) | 2022.03.17 |
대응 탐색 탐색기 내의 구성요소로 소품을 전달하는 방법 (0) | 2022.03.17 |
기본 인코딩이 ASCII인데 Python이 유니코드 문자를 인쇄하는 이유는? (0) | 2022.03.17 |