범용 타입을 옵션으로 하려면 어떻게 해야 하나요?
다음과 같은 로깅 방법이 있습니다.
private logData<T, S>(operation: string, responseData: T, requestData?: S) {
this.logger.log(operation + ' ' + this.url);
if (requestData) {
this.logger.log('SENT');
this.logger.log(requestData);
}
this.logger.log('RECEIVED');
this.logger.log(responseData);
return responseData;
}
그requestData
는 옵션입니다.전화할 수 있으면 좋겠는데logData
특정할 필요 없이S
전송하지 않을 때 입력requestData
메서드로 이동합니다.this.logData<T, any>('GET', data)
, 전화하고 싶다this.logData<T>('GET', data)
.
이것을 달성할 수 있는 방법이 있나요?
TypeScript 2.3부터는 일반 매개 변수 기본값을 사용할 수 있습니다.
private logData<T, S = {}>(operation: string, responseData: T, requestData?: S) {
// your implementation here
}
TS 업데이트 2020: 제공
void
범용 타입은 옵션입니다.
type SomeType<T = void> = OtherType<T>;
오브젝트로서의 디폴트값이 주어지는 위의 답변에서는 오브젝트는 옵션이지만 값은 부여됩니다.
디폴트 타입 값의 예는 다음과 같습니다.
{}
:
type BaseFunctionType<T1, T2> = (a:T1, b:T2) => void;
type FunctionType<T = {}> = BaseFunctionType<{name: string}, T>
const someFunction:FunctionType = (a) => {
}
someFunction({ name: "Siraj" });
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Expected 2 arguments, but got 1.(2554)
기본 generic type 값을 사용하는 예는 다음과 같습니다.
void
type BaseFunctionType<T1, T2> = (a:T1, b:T2) => void;
type FunctionType<T = void> = BaseFunctionType<{name: string}, T>
const someFunction:FunctionType = (a) => {
}
someFunction({ name: "Siraj" })
제네릭스를 옵션으로 하는 방법에 대해서는, 이쪽을 참조해 주세요.
TypeScript 2.2 (TS Playground에서 시험해 볼 수 있습니다)에 따라,this.logData("GET", data)
(와 함께)data
타입의T
)는 정상적으로 추론됩니다.this.logData<T, {}>("GET", data)
.
David Bohunek에 의해 제안된 오버로드를 사용하는 TS 버전에서 추론이 실패했을 때 적용할 수 있습니다.어쨌든 두 번째 시그니처가 선언되고 정의되기 전에 존재하는지 확인합니다.그렇지 않으면 사용 가능한 오버로드에 관여하지 않습니다.
// Declarations
private logData<T>(operation: string, responseData: T);
private logData<T, S>(operation: string, responseData: T, requestData?: S);
// Definition
private logData<T, S>(operation: string, responseData: T, requestData?: S) {
// Body
}
Type/Interface 선언에서 옵션 범용 유형을 찾는 경우 도움이 될 수 있습니다.
(이것을 찾고 있는데, 일반적인 함수 선언에 관한 답변만 찾았습니다.Siraj의 답변은 나를 올바른 방향으로 이끌었습니다.)
type ResponseWithMessage = {
message: string;
};
interface ResponseWithData<T> extends ResponseWithMessage {
data: T;
}
export type ResponseObject<T = void> = T extends void
? ResponseWithMessage
: ResponseWithData<T>;
부분적인 것은 어떻습니까?
Type의 모든 속성이 옵션으로 설정된 유형을 구성합니다.이 유틸리티는 특정 유형의 모든 하위 집합을 나타내는 유형을 반환합니다.
오버로드 방식은 다음과 같이 쓸 수 있습니다.
private logData<T>(operation: string, responseData: T);
private logData<T, S>(operation: string, responseData: T, requestData?: S) {
this.logger.log(operation + ' ' + this.url);
if (requestData) {
this.logger.log('SENT');
this.logger.log(requestData);
}
this.logger.log('RECEIVED');
this.logger.log(responseData);
return responseData;
}
하지만 꼭 필요한 건 아닌 것 같아요. 왜냐면 글씨를 쓸 필요는 없으니까요.this.logData<T, any>('GET', data)
대신 그냥 쓰세요this.logData('GET', data)
.그T
유형이 지정됩니다.
void
어떤 종류의 물체가 예상된 곳에서는 잘 재생되지 않습니다.편집: 완벽하게 잘 연주합니다. 당신은 단지 그 사실을 고려해야만 합니다.void
는, 머지 한 모든 것을 덮어씁니다( ).void & string
기본적으로는void
) - 아마도 이것이 당신이 원하는 것입니다.unknown
{}
기본적으로와 같다unknown
interface OffsetPagination {
offset: number;
limit: number;
}
interface PagePagination {
page: number;
size: number;
}
type HttpListParams<
PaginationType extends OffsetPagination | PagePagination | void = void,
Params = {
filter?: string;
},
> = PaginationType extends void ? Params : PaginationType & Params;
언급URL : https://stackoverflow.com/questions/37525094/how-can-i-make-a-generic-type-optional
'code' 카테고리의 다른 글
python의 json.dump()와 json.dumps()의 차이점은 무엇입니까? (0) | 2023.04.03 |
---|---|
비인터랙티브모드에서의 CRA Jest 실행 (0) | 2023.04.03 |
리액트 앱에서 API 키 사용 (0) | 2023.04.03 |
스프링 부트 2에 TomcatEmbeddedServletContainerFactory가 없습니다. (0) | 2023.04.03 |
각도 JS ng-반복의 첫 번째 요소 숨기기 (0) | 2023.04.03 |