당신은 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
'bestsource' 카테고리의 다른 글
여러 패턴이 있는 문자 벡터를 사용한 grep (0) | 2023.06.18 |
---|---|
Wordpress 이미지 업로드에 연결 (0) | 2023.06.18 |
Wordpress customizer 사용자 지정 제어 전송 postMessage가 작동하지 않음 (0) | 2023.06.18 |
CSV를 읽을 때 팬더의 인덱스 열 제거 (0) | 2023.06.18 |
레일즈의 환경에서 Rake 작업에 인수를 전달하는 방법은 무엇입니까? (0) | 2023.06.18 |