programing

다른 옵션 파라미터는 생략한 채 옵션 파라미터를 전달하려면 어떻게 해야 합니까?

yellowcard 2023. 3. 21. 21:51
반응형

다른 옵션 파라미터는 생략한 채 옵션 파라미터를 전달하려면 어떻게 해야 합니까?

다음 시그니처가 지정됩니다.

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

반응형