IT이야기

Typescript에서 대리자 형식 선언

cyworld 2021. 4. 9. 21:05
반응형

Typescript에서 대리자 형식 선언


C # 배경에서 왔기 때문에 함수 서명을 정의하는 데이터 유형을 만들고 싶습니다. C #에서는 다음 delegate과 같이 선언됩니다.

delegate void Greeter (string message);

public class Foo
{
    public void SayHi (Greeter g) {
        g("Hi!");
    }
}

이제 Typescript에서 비슷한 결과를 얻고 싶습니다. Typescript에는 대리자 유형이 없지만 람다 만 있다는 것을 알고 있습니다. 나는 다음과 같은 것을 생각 해냈다.

class Foo {
    SayHi (greeter: (msg: String) => void) {
        greeter('Hi!');
    }
}

이것이 작동하는 동안 메서드 서명을 (msg:String) => void두 번 재사용하고 C #의 대리자처럼 사용자 지정 형식을 만드는 것이 더 깔끔 할 것이라고 생각합니다.

이것이 어떻게 할 수 있는지 아이디어가 있습니까?


TypeScript에서 인터페이스는 호출 서명을 가질 수 있습니다. 귀하의 예에서 다음과 같이 선언 할 수 있습니다.

interface Greeter {
    (message: string): void;
}

function sayHi(greeter: Greeter) {
    greeter('Hello!');
}

sayHi((msg) => console.log(msg)); // msg is inferred as string

유형 별칭 을 사용하여 대리자와 같은 것을 만들 수 있습니다 .

type MyDelegate = (input: string) => void;

C #에서 대리자가하는 것처럼 함수 포인터의 형식 이름을 정의합니다. 다음 예제에서는 일반 유형 매개 변수와 함께 사용합니다.

type Predicate<T> = (item: T) => boolean;

export class List<T> extends Array<T> {
    constructor(...items: T[]){
        super();
        for(let i of items || []){
            this.push(i);
        }
    }
    public hasAny(predicate?: Predicate<T>): boolean {
        predicate = predicate || (i => true)
        for(let item of this) {
            if(predicate(item)) return true;
        }
        return false;
    }
}

5 년 후 많은 TS 버전이 type함수 유형을 선언하기 위해 더 간단한 정의를 사용하고 있음을 알게 되었습니다.

type Greeter = (msg: string) => void;
const someGreeter: Greeter = (msg: string) => `Hi there with ${msg}`;

호출 가능한 표현식에 대한 유형 정의 (이것은 BNF 또는 형식이 아닌 사람을위한 초안입니다 . ) :

callableType: (paramsDef) => returnType

paramsDef:    MULTIPLE paramDef SEPARATED BY ,

paramDef:     EITHER   paramName: paramType
                  OR   optionalParamName?: paramTypeWhenDefined
                  OR   ...manyParamName: eachParamType[]

예:

var func = something as ((...x: any[]) => any);

그런 다음 다음을 수행 할 수 있습니다.

var result = func("a", "b", 2);

나는 이제 @ steelbreeze / delegate를 게시하고 사용합니다 . C # 대리자에 비해 변경 불가능하지만 그렇지 않은 경우에는 잘 작동한다는 점에서 몇 가지 제한이 있습니다 (호출 될 때 호출 된 모든 함수의 결과를 반환 함).

다음과 같은 코드를 작성할 수 있습니다.

import { create as delegate } from "@steelbreeze/delegate";

function world(s: string) {
    console.log(s + " world");
}

const one = delegate(s => console.log(s + " Hello world"));
const two = delegate(s => console.log(s + " Hello"), world);

one("A");
two("B");

delegate(one, two)("C");

참조 URL : https://stackoverflow.com/questions/20310369/declare-a-delegate-type-in-typescript

반응형