bestsource

당신은 TypeScript에서 기능을 확장할 수 있습니까?

bestsource 2023. 6. 18. 16:10
반응형

당신은 TypeScript에서 기능을 확장할 수 있습니까?

전달 함수가 어떻게 호출되었는지 검사할 수 있는 스파이 함수를 생성하는 JavaScript 라이브러리를 유지 관리합니다(주로 장치 테스트에 사용).

라이브러리는 호출을 검사할 수 있는 추가 속성이 있는 함수를 만듭니다.

함수가 필요하고 추가 속성이 있는 메서드에 함수를 전달할 수 있는 TypeScript 정의를 만들 수 있습니까?

이것은 유효하지 않지만 다음과 같은 것이 있습니다.

class Spy extends function {
    wasCalled: () => boolean;
    ...
}

그러면 이 서명이 있는 함수에 스파이를 보낼 수 있습니다.

function subjectUnderTest(callback:() => void) {
    ...
}

, TypeScript 핸드북에서는 이를 "하이브리드 유형"이라고 부릅니다. 함수 유형과 일반 인터페이스의 조합이기 때문입니다.

interface Spy {
    (foo: string, bar: number) : boolean; // Just an example
    wasCalled() : boolean;
}

var spy : Spy = createASpySomehow();
var result = spy("foo", 123);
if (spy.wasCalled()) {
    // ...
}

저도 기능이 있는 수업을 확장하고 싶었고, 타입스크립트 전용 솔루션을 개발했습니다.현명한 해결책이 항상 좋은 해결책은 아니기 때문에 이것이 좋은 생각인지 잘 모르겠습니다.YMMV.

부분적인 답변을 해주신 Mattias Buelens님께 감사드립니다!저는 그것을 기반으로 하고 있습니다.

// same as in the answer of Mattias
interface Spy {
    (foo: string, bar: number): boolean // Just an example
    wasCalled(): boolean
}

// and now for the real solution!
class Spy {
    _wasCalled: boolean
    _baz: boolean // Just an example

    private constructor(baz: boolean) {
        this._wasCalled = false
        this._baz = baz
    }

    wasCalled(): boolean {
        return this._wasCalled
    }

    toString() { return '[object Spy]' }

    static create(baz: boolean) {
        const f = <Spy>function(this: Spy, foo: string, bar: number): boolean {
            // Do your thing here. Use f instead of this!
            console.log('wasCalled', f.wasCalled())
            f._wasCalled = true
        }
        const spy = new Spy(baz)
        Object.assign(f, spy)
        Object.setPrototypeOf(f, Spy.prototype)

        return f
    }
}

이 아이디어는 함수와 인스턴스를 만드는 것입니다.Spy그런 다음 함수에 프로토타입과 속성을 모두 할당합니다.정적 메서드에서 인스턴스를 반환합니다.보너스는toString()방법.

const spy = Spy.create(true)
console.log('calling spy', spy('foo', 42))
console.log('instanceof', spy instanceof Spy)

예상대로 작동합니다.

나는 그렇게 생각하지 않는다.new Spy()우리는 그 반대가 아닌 기능에 할당해야 하기 때문에 작동할 것입니다.그리고 우리가 대체할 수 없기 때문입니다.this할 수 없는this채권 발행인제가 볼 수 있는 가설적인 방법은 다음과 같은 함수 생성자를 사용하여 클래스를 확장하는 것입니다.class Spy2 extends function() {} {}하지만 이 일을 해낼 방법을 찾지 못했습니다.

언급URL : https://stackoverflow.com/questions/38338013/can-you-extend-a-function-in-typescript

반응형