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
'IT' 카테고리의 다른 글
객체마다? (0) | 2020.07.15 |
---|---|
react.js에서 한 후 페이지 맨 위로 스크롤 (0) | 2020.07.15 |
Javascript에서 goto를 어떻게 사용합니까? (0) | 2020.07.15 |
PHP는 MB / KB 변환을 파일 화합니다 (0) | 2020.07.15 |
버전 관리를하는 이유는 무엇입니까? (0) | 2020.07.15 |