다른 옵션 파라미터는 생략한 채 옵션 파라미터를 전달하려면 어떻게 해야 합니까?
다음 시그니처가 지정됩니다.
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
함수를 호출하려면 어떻게 해야 합니까?error()
를 지정하지 않음title
파라미터, 단 설정autoHideAfter
말하다1000
?
매뉴얼에 기재되어 있는 바와 같이undefined
:
export interface INotificationService {
error(message: string, title?: string, autoHideAfter? : number);
}
class X {
error(message: string, title?: string, autoHideAfter?: number) {
console.log(message, title, autoHideAfter);
}
}
new X().error("hi there", undefined, 1000);
놀이터 링크
유감스럽게도 TypeScript에는 이런 것이 없습니다(자세한 내용은 이쪽:https://github.com/Microsoft/TypeScript/issues/467)).
단, 이를 회피하려면 파라미터를 인터페이스로 변경할 수 있습니다.
export interface IErrorParams {
message: string;
title?: string;
autoHideAfter?: number;
}
export interface INotificationService {
error(params: IErrorParams);
}
//then to call it:
error({message: 'msg', autoHideAfter: 42});
또 다른 접근법은 다음과 같습니다.
error(message: string, options?: {title?: string, autoHideAfter?: number});
따라서 제목 매개 변수를 생략하려면 다음과 같이 데이터를 전송합니다.
error('the message', { autoHideAfter: 1 })
다른 파라미터를 송신하지 않아도 파라미터를 추가할 수 있기 때문에 이 옵션을 사용하는 것이 좋습니다.
를 사용할 수도 있습니다.Partial<T>
메서드의 시그니처를 입력합니다만, 이 경우는, 옵션의 인터페이스를 작성할 필요가 있습니다.
interface IMyOptions {
title: string;
autoHideAfter: number;
}
다음으로 메서드의 시그니처는 다음과 같습니다.
error(message: string, options?: Partial<IMyOptions>);
용도는 위와 같습니다.
유형Partial<T>
는 이미 다음과 같이 글로벌 입력으로 선언되어 있어야 합니다.
type Partial<T> = {
[P in keyof T]?: T[P];
};
옵션 변수를 사용할 수 있습니다.?
또는 옵션 변수가 여러 개 있는 경우...
, 예:
function details(name: string, country="CA", address?: string, ...hobbies: string) {
// ...
}
위의 경우:
name
필수입니다.country
필수이며 기본값이 있습니다.address
옵션입니다.hobbies
옵션 파라미터의 배열입니다.
이것은 @Brocco의 답변과 거의 비슷하지만 약간 뒤틀린 부분이 있습니다. 객체의 선택적 매개 변수만 전달합니다. (및 params 객체는 선택사항으로 만듭니다.)
Python의 **kwargs와 비슷하지만 꼭 그렇지는 않습니다.
export interface IErrorParams {
title?: string;
autoHideAfter?: number;
}
export interface INotificationService {
// make params optional so you don't have to pass in an empty object
// in the case that you don't want any extra params
error(message: string, params?: IErrorParams);
}
// all of these will work as expected
error('A message with some params but not others:', {autoHideAfter: 42});
error('Another message with some params but not others:', {title: 'StackOverflow'});
error('A message with all params:', {title: 'StackOverflow', autoHideAfter: 42});
error('A message with all params, in a different order:', {autoHideAfter: 42, title: 'StackOverflow'});
error('A message with no params at all:');
인터페이스상에서 복수의 메서드시그니처를 지정하고, 클래스 메서드에 복수의 메서드오버로드를 설정할 수 있습니다.
interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
error(message: string, autoHideAfter: number);
}
class MyNotificationService implements INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
error(message: string, autoHideAfter?: number);
error(message: string, param1?: (string|number), param2?: number) {
var autoHideAfter: number,
title: string;
// example of mapping the parameters
if (param2 != null) {
autoHideAfter = param2;
title = <string> param1;
}
else if (param1 != null) {
if (typeof param1 === "string") {
title = param1;
}
else {
autoHideAfter = param1;
}
}
// use message, autoHideAfter, and title here
}
}
이제 이 모든 것이 작동하게 됩니다.
var service: INotificationService = new MyNotificationService();
service.error("My message");
service.error("My message", 1000);
service.error("My message", "My title");
service.error("My message", "My title", 1000);
...그리고 그error
의 방법INotificationService
에는 다음과 같은 옵션이 있습니다.
TS에서는 파라미터를 오브젝트로 하고 오브젝트 값을 옵션으로 할 수도 있습니다.이렇게 하면 모든 파라미터를 정의할 필요는 없고 사용할 파라미터만 정의할 수도 있습니다.
public functionBeingCalled(obj: {status?: number, error?: string, message?: string}) {
if(obj.message) { console.log(obj.message) }
}
this.functionBeingCalled({message: 'Error Detected'})
error 인수를 기반으로 단일 개체 매개 변수를 받아들이는 도우미 메서드를 만들 수 있습니다.
error(message: string, title?: string, autoHideAfter?: number){}
getError(args: { message: string, title?: string, autoHideAfter?: number }) {
return error(args.message, args.title, args.autoHideAfter);
}
이러한 경우 덮어쓰지 않을 선택적 매개 변수에 "정의되지 않은" 값을 사용할 수 있습니다.
export interface INotificationService {
error(message: string, title?: string, autoHideAfter?: number);
}
다음과 같은 에러 메서드를 호출할 수 있습니다.
error("it works", undefined, 20);
조심하세요.null
여기에서는 안 돼요
https://www.typescriptlang.org/docs/handbook/functions.html
JavaScript 에서는 모든 파라미터는 옵션이며 사용자는 필요에 따라 파라미터를 해제할 수 있습니다.이 경우 값은 정의되지 않습니다.이 기능은 TypeScript에서 옵션으로 하고 싶은 파라미터의 끝에 ?를 추가함으로써 얻을 수 있습니다.예를 들어 위의 성 파라미터가 옵션이라고 가정합니다.
function buildName(firstName: string, lastName?: string) {
if (lastName) return firstName + " " + lastName;
else return firstName;
}
let result1 = buildName("Bob"); // works correctly now
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
Expected 1-2 arguments, but got 3.
let result3 = buildName("Bob", "Adams"); // ah, just right
이것은, 인터페이스 없이 실행할 수 있습니다.
class myClass{
public error(message: string, title?: string, autoHideAfter? : number){
//....
}
}
?
이치노
제목을 null로 설정할 수 있습니다.
이건 나한테 효과가 있었어.
error('This is the ',null,1000)
언급URL : https://stackoverflow.com/questions/30734509/how-to-pass-optional-parameters-while-omitting-some-other-optional-parameters
'programing' 카테고리의 다른 글
Woocommerce 체크 아웃필드 순서 변경 (0) | 2023.03.21 |
---|---|
JSX 내부의 React에서 숫자를 루프오버하는 방법 (0) | 2023.03.21 |
Python json.loads가 'ValueError:잘못된 컨트롤 문자: 1행 33(char 33)' (0) | 2023.03.21 |
순환 참조가 데이터베이스에서 허용됩니까? (0) | 2023.03.21 |
angular.copy를 사용하는 이유와 시기(Deep Copy) (0) | 2023.03.21 |