함수에 대한 컨텍스트 유형 정의를 바꾸는 방법

로만 콜리 아다

미리 정의 된 컨텍스트로 함수 집합을 실행하기위한 구성 함수를 만들려고합니다. 내 유형은 다음과 같습니다.

type Config<T> = {
    context: T;
};

type Hooks<T> = {
    hooks: T;
};

type FunctionWithThis<T> = (this: T, ...args) => any;

내 구성 함수에서 컨텍스트와 대상 함수를 병합하고 싶지만 함수에 대한 컨텍스트 매개 변수를 전달 this합니다.

 const configure = <TContext extends Object, 
                    THooks extends Record<string, FunctionWithThis<TContext>>>
                   (config: Config<TContext> & Hooks<THooks>) => {
    const result = {
        get data() { return config.context; }
    };

    Object.entries(config.hooks).forEach((action) => {
        result[action[0]] = (...args) => action[1].call(config.context, ...args);
    });

    return result as { data: TContext; } & THooks;
};

다음과 같이 사용할 수 있습니다.

const engine = configure({
    context: {
        foo: 12
    },
    hooks: {
        log() {
            console.log(this.foo); // this.foo is typed correctly here
        }
    }
});

const data = engine.data;
engine.log(); // error here

VS Code는 마지막 줄에 다음과 같은 오류를 제공합니다.

'{data : {foo : number; }; } & {log (this : {foo : number;}) : void; } '은 메소드의'this '유형'{foo : number; } '. '{데이터 : {foo : number; }; } & {log (this : {foo : number;}) : void; } '이지만'{foo : number; } '.

log잘못된 컨텍스트에서 함수 를 호출하려고한다는 의미라고 생각합니다 . 출력의 각 기능에 대한 컨텍스트 유형을 변경할 수 있습니까?

아니면 그것을 해결할 다른 방법이 있습니까?

Typescript 놀이터

티티 안 세르 니코 바-드라고 미르

이후 THooks유형의 구성원이 있어야합니다 (this: T, ...args: any[]) => any,의 기능이 THooks필요합니다 this유형으로 TContext. 그리고 당신의 함수는의 this의지를 확실히 보장하지만 TContext, 재조정 된 함수의 유형은 이것을 반영하지 않습니다. 이러한 함수 중 하나를 호출 할 때 지금 engine의 형태에서, TS의 외모를 enigine하고보고 그것은 적절하지 않다 this에 대한 log오류와 문제를 해결합니다.

this구현 내부 를 전달하므로 this결과 에서 매개 변수 를 지워야합니다 . 매핑 된 조건부 유형으로이를 수행 할 수 있습니다.

type Config<T> = {
    context: T;
};

type Hooks<T> = {
    hooks: T;
};

type FunctionWithThis<T> = (this: T, ...args: any[]) => any;

type RemoveThis<T extends Record<string, FunctionWithThis<any>>> = {
    [P in keyof T]: T[P] extends (...a: infer A) => infer R ?  (...a:A) => R: never
}

 const configure = <TContext extends Object, 
                    THooks extends Record<string, FunctionWithThis<TContext>>>
                   (config: Config<TContext> & Hooks<THooks>) => {
    const result = {
        get data() { return config.context; }
    };

    Object.entries(config.hooks).forEach((action) => {
        (result as any)[action[0]] = (...args: any[]) => action[1].call(config.context, ...args);
    });

    return result as { data: TContext; } & RemoveThis<THooks>;
};

const engine = configure({
    context: {
        foo: 12
    },
    hooks: {
        log() {
            console.log(this.foo); // this.foo is typed correctly here
        }
    }
});

const data = engine.data;
engine.log(); // ok

놀이터 링크

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C #에서 한 줄의 특정 텍스트를 바꾸는 방법

분류에서Dev

더 높은 종류의 유형에 대한 컨텍스트 바인딩?

분류에서Dev

텍스트 파일의 특정 줄에 한 번 텍스트를 바꾸는 방법은 무엇입니까?

분류에서Dev

텍스트 영역 컨텍스트에 대해 Opera에서 검색 및 바꾸기를 수행하는 방법은 무엇입니까?

분류에서Dev

sed : 선택한 텍스트를 선택한 텍스트 선택 내에 유지하면서 텍스트를 바꾸는 방법은 무엇입니까?

분류에서Dev

텍스트 영역에서 특정 입력 유형 이벤트를 시작하는 방법에 대한 정보는 어디에서 찾을 수 있습니까?

분류에서Dev

어떻게 클래스의 방법과 의도에 대한 컨텍스트를 전달하는 방법?

분류에서Dev

Core Data 컨텍스트에 대한 불법 액세스 : AppDelegate에 제공된 컨텍스트의 소유자는 어떤 스레드입니까?

분류에서Dev

한 파일에서 다른 파일로 텍스트를 복사 한 다음 텍스트 문자열의 첫 글자를 대문자로 바꾸는 방법

분류에서Dev

파이썬 내장 함수 유형, 새 유형에 대한 멤버 함수를 정의하는 방법은 무엇입니까?

분류에서Dev

웹 서비스에 대한 Rebus 트랜잭션 컨텍스트를 설정하는 방법

분류에서Dev

대화 상자의 클릭 방법에서 컨텍스트를 얻는 방법

분류에서Dev

입력 유형 = 텍스트에 대한 Javascript의 입력을 확인하는 방법

분류에서Dev

콘텐츠 편집 가능한 div의 텍스트 일부에 이미 완료된 텍스트 형식을 잃지 않고 문자열을 바꾸는 방법

분류에서Dev

유한 유형의 함수로 정의 된 벡터를 연결하는 방법

분류에서Dev

클래스 수준 typedef 함수에 대한 정의를 만드는 방법

분류에서Dev

Kotlin 데이터 클래스의 속성에 대한 OpenAPI 유형 / 스키마를 설정하는 방법

분류에서Dev

메모장 ++의 정규식 찾기 대화 상자에서 텍스트를 둘러싼 텍스트를 바꾸는 방법은 무엇입니까?

분류에서Dev

다른 유형의 유사한 함수에 대해 C #에서 중복 코드를 줄이는 방법

분류에서Dev

인터페이스에 대한 동적 ([키 : 유형] : 유형) 및 정적 유형을 혼합하는 방법

분류에서Dev

사용자 지정 클래스의 매개 변수에 대한 유형 힌트를 지정하는 방법은 무엇입니까?

분류에서Dev

Angular에서 텍스트를 대문자로 바꾸는 방법을 이해하지 못함

분류에서Dev

'DATA'를 수정하는 방법은 지정된 컨텍스트에서 유효하지 않은 유형입니다.

분류에서Dev

여러 유형 중 하나의 (동종) 시퀀스를 허용하는 함수에 대한 유형 힌트

분류에서Dev

내부 함수가 반환 될 때 자바 스크립트가 외부 함수의 실행 컨텍스트를 유지하는 방법은 무엇입니까?

분류에서Dev

특수 문자 (수학 방정식)를 포함하는 텍스트의 줄 바꾸기 Linux 텍스트

분류에서Dev

Orion 컨텍스트 브로커에 대한 사용자 정의 API 구조를 정의하는 방법은 무엇입니까?

분류에서Dev

C ++에서 여러 클래스 유형에 대해 동일한 템플릿 멤버 함수를 지정하는 방법은 무엇입니까?

분류에서Dev

엔티티의 상위 컨텍스트에 대한 참조를 가져 오는 방법

Related 관련 기사

  1. 1

    C #에서 한 줄의 특정 텍스트를 바꾸는 방법

  2. 2

    더 높은 종류의 유형에 대한 컨텍스트 바인딩?

  3. 3

    텍스트 파일의 특정 줄에 한 번 텍스트를 바꾸는 방법은 무엇입니까?

  4. 4

    텍스트 영역 컨텍스트에 대해 Opera에서 검색 및 바꾸기를 수행하는 방법은 무엇입니까?

  5. 5

    sed : 선택한 텍스트를 선택한 텍스트 선택 내에 유지하면서 텍스트를 바꾸는 방법은 무엇입니까?

  6. 6

    텍스트 영역에서 특정 입력 유형 이벤트를 시작하는 방법에 대한 정보는 어디에서 찾을 수 있습니까?

  7. 7

    어떻게 클래스의 방법과 의도에 대한 컨텍스트를 전달하는 방법?

  8. 8

    Core Data 컨텍스트에 대한 불법 액세스 : AppDelegate에 제공된 컨텍스트의 소유자는 어떤 스레드입니까?

  9. 9

    한 파일에서 다른 파일로 텍스트를 복사 한 다음 텍스트 문자열의 첫 글자를 대문자로 바꾸는 방법

  10. 10

    파이썬 내장 함수 유형, 새 유형에 대한 멤버 함수를 정의하는 방법은 무엇입니까?

  11. 11

    웹 서비스에 대한 Rebus 트랜잭션 컨텍스트를 설정하는 방법

  12. 12

    대화 상자의 클릭 방법에서 컨텍스트를 얻는 방법

  13. 13

    입력 유형 = 텍스트에 대한 Javascript의 입력을 확인하는 방법

  14. 14

    콘텐츠 편집 가능한 div의 텍스트 일부에 이미 완료된 텍스트 형식을 잃지 않고 문자열을 바꾸는 방법

  15. 15

    유한 유형의 함수로 정의 된 벡터를 연결하는 방법

  16. 16

    클래스 수준 typedef 함수에 대한 정의를 만드는 방법

  17. 17

    Kotlin 데이터 클래스의 속성에 대한 OpenAPI 유형 / 스키마를 설정하는 방법

  18. 18

    메모장 ++의 정규식 찾기 대화 상자에서 텍스트를 둘러싼 텍스트를 바꾸는 방법은 무엇입니까?

  19. 19

    다른 유형의 유사한 함수에 대해 C #에서 중복 코드를 줄이는 방법

  20. 20

    인터페이스에 대한 동적 ([키 : 유형] : 유형) 및 정적 유형을 혼합하는 방법

  21. 21

    사용자 지정 클래스의 매개 변수에 대한 유형 힌트를 지정하는 방법은 무엇입니까?

  22. 22

    Angular에서 텍스트를 대문자로 바꾸는 방법을 이해하지 못함

  23. 23

    'DATA'를 수정하는 방법은 지정된 컨텍스트에서 유효하지 않은 유형입니다.

  24. 24

    여러 유형 중 하나의 (동종) 시퀀스를 허용하는 함수에 대한 유형 힌트

  25. 25

    내부 함수가 반환 될 때 자바 스크립트가 외부 함수의 실행 컨텍스트를 유지하는 방법은 무엇입니까?

  26. 26

    특수 문자 (수학 방정식)를 포함하는 텍스트의 줄 바꾸기 Linux 텍스트

  27. 27

    Orion 컨텍스트 브로커에 대한 사용자 정의 API 구조를 정의하는 방법은 무엇입니까?

  28. 28

    C ++에서 여러 클래스 유형에 대해 동일한 템플릿 멤버 함수를 지정하는 방법은 무엇입니까?

  29. 29

    엔티티의 상위 컨텍스트에 대한 참조를 가져 오는 방법

뜨겁다태그

보관