[typescript] TypeScript 인터페이스에서 정적 속성을 정의하는 방법

typescript 인터페이스 에서 정적 속성 을 선언하고 싶 습니까? 나는 이것에 관해 아무데도 찾지 못했습니다.

interface myInterface {
  static Name:string;
}

가능할까요?



답변

TypeScript에서 인터페이스에 대한 정적 속성을 정의 할 수 없습니다.

Date의 정의에 추가하는 대신 객체 를 변경하고 싶었다고 가정 해 보겠습니다. 객체를 Date래핑하거나 단순히 Date하지 않는 작업 을 수행하기 위해 풍부한 날짜 클래스를 만들 수 있습니다 .

class RichDate {
    public static MinValue = new Date();
}

Date는 TypeScript의 인터페이스이기 때문에 extends키워드를 사용하여 클래스로 확장 할 수 없습니다 . date가 클래스 인 경우 좋은 솔루션이 될 수 있으므로 조금 아쉽습니다 .

MinValue프로토 타입에 속성 을 제공하기 위해 Date 객체를 확장하려는 경우 다음을 수행 할 수 있습니다.

interface Date {
    MinValue: Date;
}

Date.prototype.MinValue = new Date(0);

다음을 사용하여 호출 :

var x = new Date();
console.log(x.MinValue);

인스턴스없이 사용할 수 있도록하려면 할 수도 있습니다 …하지만 약간 까다 롭습니다.

interface DateStatic extends Date {
    MinValue: Date;
}

Date['MinValue'] = new Date(0);

다음을 사용하여 호출 :

var x: DateStatic = <any>Date; // We aren't using an instance
console.log(x.MinValue);


답변

@Duncan의 @Bartvds의 답변을 따르십시오. 몇 년이 지난 후에도 실행 가능한 방법을 제공하십시오.

Typescript 1.5가 출시 된 후 (@Jun 15 ’15)이 시점에서 유용한 인터페이스

interface MyType {
    instanceMethod();
}

interface MyTypeStatic {
    new():MyType;
    staticMethod();
}

데코레이터의 도움으로 이런 식으로 구현할 수 있습니다.

/* class decorator */
function staticImplements<T>() {
    return <U extends T>(constructor: U) => {constructor};
}

@staticImplements<MyTypeStatic>()   /* this statement implements both normal interface & static interface */
class MyTypeClass { /* implements MyType { */ /* so this become optional not required */
    public static staticMethod() {}
    instanceMethod() {}
}

github open issue 13462 에서 내 의견을 참조하십시오 .

시각적 결과 : 정적 메서드 누락의 힌트와 함께 컴파일 오류.
여기에 이미지 설명 입력

정적 메서드 구현 후 메서드 누락에 대한 힌트.
여기에 이미지 설명 입력

정적 인터페이스와 일반 인터페이스가 모두 충족 된 후 컴파일이 전달되었습니다.
여기에 이미지 설명 입력


답변

일반적으로 인터페이스를 정의 할 수 있습니다.

interface MyInterface {
    Name:string;
}

하지만 당신은 할 수 없습니다

class MyClass implements MyInterface {
    static Name:string; // typescript won't care about this field
    Name:string;         // and demand this one instead
}

클래스가 정적 속성에 대해이 인터페이스를 따라야한다는 것을 표현하려면 약간의 속임수가 필요합니다.

var MyClass: MyInterface;
MyClass = class {
    static Name:string; // if the class doesn't have that field it won't compile
}

클래스 이름을 유지할 수도 있습니다. TypeScript (2.0)는 신경 쓰지 않습니다.

var MyClass: MyInterface;
MyClass = class MyClass {
    static Name:string; // if the class doesn't have that field it won't compile
}

많은 인터페이스에서 정적으로 상속하려면 먼저 새 인터페이스로 병합해야합니다.

interface NameInterface {
    Name:string;
}
interface AddressInterface {
    Address:string;
}
interface NameAndAddressInterface extends NameInterface, AddressInterface { }
var MyClass: NameAndAddressInterface;
MyClass = class MyClass {
    static Name:string; // if the class doesn't have that static field code won't compile
    static Address:string; // if the class doesn't have that static field code won't compile
}

또는 병합 된 인터페이스의 이름을 지정하지 않으려면 다음을 수행 할 수 있습니다.

interface NameInterface {
    Name:string;
}
interface AddressInterface {
    Address:string;
}
var MyClass: NameInterface & AddressInterface;
MyClass = class MyClass {
    static Name:string; // if the class doesn't have that static field code won't compile
    static Address:string; // if the class doesn't have that static field code won't compile
}

작업


답변

정적 속성은 일반적으로 개체의 (전역) 생성자에 배치되는 반면 “interface”키워드는 개체의 인스턴스에 적용됩니다.

TypeScript로 클래스를 작성하는 경우 주어진 이전 답변은 물론 정확합니다. 이미 다른 곳에 구현 된 객체를 설명하는 경우 정적 속성을 포함하는 전역 생성자가 다음과 같이 선언 될 수 있음을 다른 사람들이 알 수 있습니다.

declare var myInterface : {
  new(): Interface;
  Name:string;
}


답변

정적 수정자는 형식 멤버에 나타날 수 없습니다 (TypeScript 오류 TS1070). 이것이 미션을 해결하기 위해 추상 클래스를 사용하는 것이 좋습니다.

// Interface definition
abstract class MyInterface {
  static MyName: string;
  abstract getText(): string;
}

// Interface implementation
class MyClass extends MyInterface {
  static MyName = 'TestName';
  getText(): string {
    return `This is my name static name "${MyClass.MyName}".`;
  }
}

// Test run
const test: MyInterface = new MyClass();
console.log(test.getText());


답변

위의 @duncan의 new()정적 유형 지정 솔루션 은 인터페이스에서도 작동합니다.

interface MyType {
    instanceMethod();
}

interface MyTypeStatic {
    new():MyType;
    staticMethod();
}


답변

정적 클래스를 정의하려는 경우 (즉, 모든 메서드 / 속성이 정적 임) 다음과 같이 할 수 있습니다.

interface MyStaticClassInterface {
  foo():string;
}

var myStaticClass:MyStaticClassInterface = {
  foo() {
    return 'bar';
  }
};

이 경우 정적 “클래스”는 실제로 모든 메소드를 구현하는 일반 ol’-js- 객체입니다. MyStaticClassInterface