Typescript를 사용하여 클래스에 메소드를 추가하는 방법이 있습니까?

StackOverflow https://stackoverflow.com//questions/12698893

  •  12-12-2019
  •  | 
  •  

문제

나는 플라이에서 프로토 타입 / 클래스에 메소드를 추가하는 일종의 mixin 메소드를 만들지 만

와 같은 오류가 발생합니다

'Greetname'속성은 'Greeter'유형의 가치에 없습니다.

'Greetname'속성은 'Greeter'유형의 가치에 없습니다.

다음 코드를 실행할 때.

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

Greeter.prototype.greetName = function(name){
        return this.greet() + ' ' + name;
}

var greeter = new Greeter('Mr');

window.alert(greeter.greetName('Name'));
.

실제로 유효한 JS로 컴파일되어 예상대로 실행됩니다.컴파일러 경고 / 오류 없이이 작업을 수행하는 방법이 있습니까?

도움이 되었습니까?

해결책

이 솔루션은 동적으로 메소드를 추가 할 때 유형을 입력 할 수있는 이점이 있습니다.

class MyClass {
    start() {

    }
}
var example = new MyClass();
// example.stop(); not allowed


interface MyClass {
  stop(): void;
}

MyClass.prototype['stop'] = function () {
    alert('Stop');
}
var stage2 = example;
stage2.stop();
.

다른 팁

현재 지원되지 않는 작업에 대한 부분 클래스의 개념이 필요합니다.나는 이러한 유형의 시나리오에 대해 내가 발견 한 것이 더 나은 것을 알려 드리겠습니다 (나는 Typescript에서 Typescript에서 프로그래밍 해왔다 - 나는 MS에 있지만 Typescript 팀은 아닙니다./ P>

인터페이스는 인터페이스에 추가하는 방법을 단순히 탐지하면 사실을 확장 할 수 있습니다.이 예에서는 jQuery 플러그인을 설치하면 ijQuery & IJQueryUtil 인터페이스를 다시 정의하여 플러그인 추가 메소드를 포함시킬 것입니다.그 시점부터 $ .plugin ()을 통해 플러그인 메소드를 호출 할 수 있으며 Typescript는 행복합니다.

이 작업을 수행하는 또 다른 방법이 있습니다.

Greeter["SomeProperty"] = function() {
     return "somevalue";
};
.

는 JavaScript에서 속성 인덱서 기능을 사용하고 Typescript가 불평하지 않습니다.

@fenton 예제와 유사하지만 gnarly 재료가없는 경우 :

class MyClass {
    start() {
    }
}
MyClass.prototype['stop'] = function () {
    alert('Stop');
}

interface MyClass {
    stop(): void;
}

var example = new MyClass();
example.stop(); // Allowed!!!
.

이것은 RxJS

의 방식입니다.
import {Observable} from "./observable"; // which is Greeter in your case 


declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}

Observable.prototype.map = function (f) {

}
.

이를 모듈 기능 증가라고합니다.

클래스에 대한 동적 메소드 및 속성을 구현 해야하는 후 TypeScript 컴파일러가 불평하는 것을 방지하기 위해 다음을 수행 할 수 있었던 솔루션이었습니다.

...
window.alert(greeter['greetName']('Name'));
.

기본적으로 속성 접근 자 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top