TypeScript 콜백 유형 정의


172

TypeScript에는 다음과 같은 클래스가 있습니다.

class CallbackTest
{
    public myCallback;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

나는 이런 클래스를 사용하고 있습니다 :

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

코드가 작동하므로 예상대로 메시지 상자가 표시됩니다.

내 질문은 : 내 수업 필드에 제공 할 수있는 유형이 myCallback있습니까? 현재 공개 필드 myCallbackany위와 같이 유형이 있습니다. 콜백의 메소드 서명을 어떻게 정의 할 수 있습니까? 또는 유형을 콜백 유형으로 설정할 수 있습니까? 아니면 이것들을 더할 수 있습니까? any(암시 적 / 명시 적) 을 사용해야 합니까?

나는 이와 같은 것을 시도했지만 작동하지 않았다 (컴파일 타임 오류).

public myCallback: ();
// or:
public myCallback: function;

이 온라인에 대한 설명을 찾을 수 없으므로 도와 드리겠습니다.

답변:


211

방금 TypeScript 언어 사양에서 무언가를 찾았습니다. 상당히 쉽습니다. 나는 꽤 가까웠다.

구문은 다음과 같습니다.

public myCallback: (name: type) => returntype;

내 예에서, 그것은

class CallbackTest
{
    public myCallback: () => void;

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

8
콜백 서명을 정의하는 데 매개 변수 이름이 필요한 이유를
모르겠습니다

4
나는 그것이 C # 팀의 문화 유산 일지도 모른다고 생각한다. 나는 그것을 좋아한다고 생각한다.
2grit

@nikeee 문서의 해당 페이지에 대한 링크를 제공 할 수 있습니까?
jcairney

이것은 좋은 링크가 될 수 있습니다 fettblog.eu/typescript-substitutability
nilakantha singh deo

147

한 단계 더 나아가려면 다음과 같은 함수 서명에 대한 유형 포인터를 선언 할 수 있습니다.

interface myCallbackType { (myArgument: string): void }

다음과 같이 사용하십시오.

public myCallback : myCallbackType;

9
이것은 (IMO) 허용 된 답변보다 훨씬 나은 솔루션입니다. 유형을 정의 한 다음 해당 유형의 매개 변수 (콜백)를 전달한 다음 호출하는 것을 포함하여 원하는 방식으로 사용할 수 있기 때문입니다. 수락 된 답변은 멤버 변수를 사용하므로 멤버 변수를 함수로 설정 한 다음 변수를 먼저 설정하는 것이 메서드 호출 계약의 일부이므로 메서드를 추악하고 오류가 발생하기 쉽습니다.
David

또한 콜백을 널 입력 가능으로 쉽게 설정할 수 있습니다 (예 :let callback: myCallbackType|null = null;
Doches

1
TSLint는 "TSLint : 인터페이스에 호출 서명 만 있습니다 type MyHandler = (myArgument: string) => void. 대신 사용하십시오. (callable-types)" ; 참조 TSV의 대답
Arjan

이 답변의 초기 초안은 실제로이 질문으로 이끈 문제를 해결했습니다. 컴파일러 오류없이 여러 매개 변수를 허용 할 수있는 인터페이스 내에 허용 가능한 충분한 함수 서명을 정의하려고했습니다. 내 경우에는 대답을 사용하는 것이 었습니다 ...args: any[]. 예 : export interface MyInterface {/ ** 콜백 함수. / 콜백 : (... args : any []) => any, / * 콜백 함수의 매개 변수. * / callbackParams : any []}
Ken Lyon

61

새로운 타입을 선언 할 수 있습니다 :

declare type MyHandler = (myArgument: string) => void;

var handler: MyHandler;

최신 정보.

declare키워드는 필요하지 않습니다. .d.ts 파일 또는 이와 유사한 경우에 사용해야합니다.


이에 대한 설명서는 어디서 찾을 수 있습니까?
E. Sundin

@ E.Sundin -의 장 "유형 별칭" typescriptlang.org/docs/handbook/advanced-types.html
TSV

1
같은 페이지 (현재)에는 "소프트웨어의 이상적인 속성이 확장 가능하기 때문에 가능한 경우 항상 유형 별칭에 대한 인터페이스를 사용해야합니다."라고 말합니다.
Arjan

@Arjan-나는 객체에 대해 전적으로 동의합니다. 기능을 어떻게 확장 하시겠습니까?
TSV

형식 선언은 선택 사항입니다. var handler: (myArgument: string) => void구문 상 유효합니다 (약간 지저분한 경우).
Hutch

35

다음은 예입니다. 매개 변수를 허용하지 않고 아무것도 반환하지 않습니다.

class CallbackTest
{
    public myCallback: {(): void;};

    public doWork(): void
    {
        //doing some work...
        this.myCallback(); //calling callback
    }
}

var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();

매개 변수를 승인하려면 해당 매개 변수도 추가 할 수 있습니다.

public myCallback: {(msg: string): void;};

그리고 값을 반환하려면 다음을 추가하십시오.

public myCallback: {(msg: string): number;};

기능적으로는 동일합니다. 동일한 것을 정의하고 함수 서명에 대한 유형 검사를 제공합니다. 원하는 것을 사용할 수 있습니다. 사양은 그들이 말한다 exactly equivalent.
Fenton

6
@ nikeee : 질문은 대답과 다른 점이 무엇입니까? 스티브는 자신의 답변을 자신의 앞에 게시했습니다.
jgauffin 2016 년

@jgauffin 사실, 결과는 같습니다. Steve의 버전이 전체 인터페이스 정의를 허용하기 때문에 콜백에 대해 이야기 할 때 IMO가 게시 한 솔루션이 더 자연 스럽습니다. 그것은 당신의 선호에 달려 있습니다.
nikeee 2016 년

@Fenton 해당 문서에 대한 링크를 제공 할 수 있습니까?
jcairney

17

일반 기능을 원하면 다음을 사용할 수 있습니다. 비록 어디에도 문서화되지 않은 것 같습니다.

class CallbackTest {
  myCallback: Function;
}   

3

다음을 사용할 수 있습니다.

  1. 별명 유형 ( type키워드 사용 , 함수 리터럴 별명 지정)
  2. 상호 작용
  3. 함수 리터럴

사용 방법의 예는 다음과 같습니다.

type myCallbackType = (arg1: string, arg2: boolean) => number;

interface myCallbackInterface { (arg1: string, arg2: boolean): number };

class CallbackTest
{
    // ...

    public myCallback2: myCallbackType;
    public myCallback3: myCallbackInterface;
    public myCallback1: (arg1: string, arg2: boolean) => number;

    // ...

}

1

콜백을 이벤트 리스너에 추가하려고 할 때 동일한 오류가 발생했습니다. 이상하게도 콜백 유형을 EventListener로 설정하면 문제가 해결되었습니다. 전체 함수 서명을 유형으로 정의하는 것보다 더 우아해 보이지만 이것이 올바른 방법인지 확실하지 않습니다.

class driving {
    // the answer from this post - this works
    // private callback: () => void; 

    // this also works!
    private callback:EventListener;

    constructor(){
        this.callback = () => this.startJump();
        window.addEventListener("keydown", this.callback);
    }

    startJump():void {
        console.log("jump!");
        window.removeEventListener("keydown", this.callback);
    }
}

좋아. 그러나 다른 반은 어디에서 활동하고 있습니까?
Yaro

1

조금 늦었지만 얼마 전에 TypeScript에서 콜백 유형을 정의 할 수 있습니다.

type MyCallback = (KeyboardEvent) => void;

사용 예 :

this.addEvent(document, "keydown", (e) => {
    if (e.keyCode === 1) {
      e.preventDefault();
    }
});

addEvent(element, eventName, callback: MyCallback) {
    element.addEventListener(eventName, callback, false);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.