IT

TypeScript 정적 클래스

lottoking 2020. 7. 15. 07:13
반응형

TypeScript 정적 클래스


C #과 같은 구문을 좋아하기 때문에 JS에서 TypeScript로 이동하고 싶었습니다. TypeScript에서 정적 클래스를 선언하는 방법을 제거하는 것입니다.

C #에서는 종종 정적 클래스를 사용하여 변수와 메소드를 구성하여 개체를 인스턴스화하지 명명 된 클래스로 묶습니다. 바닐라 JS에서는 간단한 JS 수업으로 작업을 수행했습니다.

var myStaticClass = {
    property: 10,
    method: function(){}
}

TypeScript에서는 C-sharpy를 사용하지만 TS는 정적 클래스가 존재하지 않습니다. 이 문제에 대한 해결책은 무엇입니까?


TypeScript는 C #이 아니거나 TypeScript에서 동일한 C # 개념을 기대할 필요는 없습니다. 문제는 왜 정적 클래스를 원하십니까?

C #에서 정적 클래스는 서브 클래 싱 할 수없고 메소드 만 포함 해야하는 클래스입니다. C #에서는 외부에서 함수를 정의 할 수 없습니다. 그러나 TypeScript에서는 이것이 가능합니다.

함수 / 메소드를 네임 스페이스 (예 : 전역이 아닌)에 넣는 방법을 찾고있는 모듈, 예를 들어 TypeScript의 사용을 고려할 수 있습니다.

module M {
    var s = "hello";
    export function f() {
        return s;
    }
}

외부에서 Mf ()에 액세스 할 수있는 것은 액세스 할 수 제한 모듈을 확장 할 수 없습니다.

자세한 내용은 TypeScript 사양 을 참조하십시오.


추상 클래스는 TypeScript 1.6부터 TypeScript의 일류 시민이었습니다. 추상 클래스를 인스턴스화 할 수 없습니다.

예를 들면 다음과 같습니다.

export abstract class MyClass {         
    public static myProp = "Hello";

    public static doSomething(): string {
      return "World";
    }
}

const okay = MyClass.doSomething();

//const errors = new MyClass(); // Error

클래스의 정적 속성 사양 및 메서드 정의는 Typescript 언어의 8.2.1에 설명되어 있습니다 .

class Point { 
  constructor(public x: number, public y: number) { } 
  public distance(p: Point) { 
    var dx = this.x - p.x; 
    var dy = this.y - p.y; 
    return Math.sqrt(dx * dx + dy * dy); 
  } 
  static origin = new Point(0, 0); 
  static distance(p1: Point, p2: Point) { 
    return p1.distance(p2); 
  } 
}

여기서 Point.distance()정적 (또는 "클래스") 방법이다.


이 질문은 꽤 오래 현재 버전의 언어를 활용하는 답변을 남기고 싶습니다. 불행히도 정적 생성 클래스는 여전히 TypeScript에 존재하지 않지만 외부 생성자가 클래스를 사용하여 작은 오버 헤드로 유사하게 작동하는 클래스를 사용할 수 있습니다.

class MyStaticClass {
    public static readonly property: number = 42;
    public static myMethod(): void { /* ... */ }
    private constructor() { /* noop */ }
}

이 스 니펫을 사용하는 C #과 동일한 "정적"클래스를 사용하여 내부에서 인스턴스화 할 수 있으면 유일한 단점이 있습니다. 더 많은 개인 생성자 클래스를 확장 할 수 없습니다.


이것은 한 가지 방법입니다.

class SomeClass {
    private static myStaticVariable = "whatever";
    private static __static_ctor = (() => { /* do static constructor stuff :) */ })();
}

__static_ctor다음은 즉시 호출 된 함수입니다. Typescript는 생성 된 클래스의 끝에서이를 호출하는 코드를 출력합니다.

업데이트 : 더 필요 이상 정적 멤버가 참조 할 수없는 정적 생성자의 유형의 경우 추가 단계가 단계가 있습니다.

class SomeClass<T> {
    static myStaticVariable = "whatever";
    private ___static_ctor = (() => { var someClass:SomeClass<T> ; /* do static constructor stuff :) */ })();
    private static __static_ctor = SomeClass.prototype.___ctor();
}

어떤 경우에는, 물론, 단지 일반적인 당신은 유형의 정적 생성자를 호출 할 수 있습니다 같은 클래스를 :

class SomeClass<T> {
    static myStaticVariable = "whatever";
    private __static_ctor = (() => { var example: SomeClass<T>; /* do static constructor stuff :) */ })();
}
SomeClass.prototype.__static_ctor();

그냥 NEVER 사용과 기억 this__static_ctor(명백하게) 위.


오늘은 사용 사례 (2018 년 7 월 31 일)를 얻었습니다 해결 방법이라는 것을 알았습니다. 그것은 내 연구를 기반으로하며 나를 위해 일했습니다. 예상 -TypeScript에서 다음을 달성합니다.

var myStaticClass = {
    property: 10,
    method: function(){} 
}

나는 이걸했다 :

//MyStaticMembers.ts
namespace MyStaticMembers {
        class MyStaticClass {
           static property: number = 10;
           static myMethod() {...}
        }
        export function Property(): number {
           return MyStaticClass.property;
        }
        export function Method(): void {
           return MyStaticClass.myMethod();
        }
     }

따라서 다음과 같이 소비합니다.

//app.ts
/// <reference path="MyStaticMembers.ts" />
    console.log(MyStaticMembers.Property);
    MyStaticMembers.Method();

이것은 나를 위해 일했습니다. 누군가 더 나은 제안이 있으면 모두 들려주세요. 감사합니다 ...


C #과 같은 언어의 정적 클래스는 데이터와 함수를 그룹화하는 다른 최상위 구조가 없기 때문에 존재합니다. JavaScript에서는 그렇게 많은 것들이 더 자연 스럽습니다. 클래스 구문을 더 가깝게 모방하기 위해 다음과 같이 메소드를 선언 할 수 있습니다.

const myStaticClass = {
    property: 10,

    method() {

    }
}

참조 http://www.basarat.com/2013/04/typescript-static-constructors-for.html를

이것은 정적 생성 튼 '가짜'하는 방법입니다. 위험성이없는 것은 아닙니다 . 참조 된 codeplex 항목을 참조 하십시오 .

class Test {
    static foo = "orig";

    // Non void static function
    static stat() {
        console.log("Do any static construction here");
        foo = "static initialized";
        // Required to make function non void
        return null;
    }
    // Static variable assignment
    static statrun = Test.stat();
}

// Static construction will have been done:
console.log(Test.foo);

이를 달성하는 한 가지 가능한 방법은 다른 클래스 유전자 클래스의 정적 인스턴스를 수행하는 것입니다. 예를 들면 :

class SystemParams
{
  pageWidth:  number = 8270;
  pageHeight: number = 11690;  
}

class DocLevelParams
{
  totalPages: number = 0;
}

class Wrapper
{ 
  static System: SystemParams = new SystemParams();
  static DocLevel: DocLevelParams = new DocLevelParams();
}

다음 인스턴스를 선택할 수 있습니다. Wrapper를 사용하여 변수에 액세스 할 수 있습니다. 예를 들면 :

Wrapper.System.pageWidth = 1234;
Wrapper.DocLevel.totalPages = 10;

자바 스크립트 유형에서는 (원래 질문에서 어떤대로)의 이점을 얻지 만 TypeScript 타이핑 추가 할 수있는 곳이 있습니다. 또한 클래스의 모든 선행 변수가 '정적'을 추가하지 않습니다.


나는 원하는 것을 찾고 있습니다 Singleton Pattern.

참조 : 싱글 톤 패턴

여러 유형의 파일을로드하기 위해 BulkLoader 클래스에서 작업 중이며 Singleton 패턴을 사용하고 싶습니다. 이렇게하면 메인 애플리케이션 클래스에서 파일을로드하고 다른 클래스에서로드 된 파일을 쉽게 검색 할 수 있습니다.

다음은 TypeScript 및 Singleton 패턴을 사용하여 게임의 점수 관리자를 만드는 간단한 예입니다.

class SingletonClass {

private static _instance:SingletonClass = new SingletonClass();

private _score:number = 0;

constructor() {
    if(SingletonClass._instance){
        throw new Error("Error: Instantiation failed: Use SingletonDemo.getInstance() instead of new.");
    }
    SingletonClass._instance = this;
}

public static getInstance():SingletonClass
{
    return SingletonClass._instance;
}

public setScore(value:number):void
{
    this._score = value;
}

public getScore():number
{
    return this._score;
}

public addPoints(value:number):void
{
    this._score += value;
}

public removePoints(value:number):void
{
    this._score -= value;
}   }

그런 다음 다른 클래스의 어느 곳에서나 다음과 같이 Singleton에 액세스 할 수 있습니다.

var scoreManager = SingletonClass.getInstance();
scoreManager.setScore(10); scoreManager.addPoints(1);
scoreManager.removePoints(2); console.log( scoreManager.getScore() );

키워드 namespace사용 하여 변수, 클래스, 메소드 등을 구성 할 수도 있습니다 . 문서 참조

namespace Validation {
    export interface StringValidator {
        isAcceptable(s: string): boolean;
    }

    const lettersRegexp = /^[A-Za-z]+$/;
    const numberRegexp = /^[0-9]+$/;

    export class LettersOnlyValidator implements StringValidator {
        isAcceptable(s: string) {
            return lettersRegexp.test(s);
        }
    }

    export class ZipCodeValidator implements StringValidator {
        isAcceptable(s: string) {
            return s.length === 5 && numberRegexp.test(s);
        }
    }
}

참고 URL : https://stackoverflow.com/questions/13212521/typescript-static-classes

반응형