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