Typescript: 정적 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜κΈ°μœ„ν•œ 지원 μΈν„°νŽ˜μ΄μŠ€ μΆ”κ°€

에 λ§Œλ“  2017λ…„ 01μ›” 13일  Β·  43μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

TypeScript 버전 : 2.0.3

μ•”ν˜Έ

interface Foo {
public static myStaticMethod(param1: any);
}

μ˜ˆμƒλ˜λŠ” λ™μž‘ :
였λ₯˜ μ—†μŒ
μ‹€μ œ 행동 :
μ§€μ›λ˜μ§€ μ•ŠμŒ

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@aluanhaddad λ‚˜λŠ” λ‹Ήμ‹ μ˜ μ½”λ“œκ°€ λͺ…λ°±ν•œ 문제의 ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

interface JsonSerializable {
      public static fromJson(obj: any);
      public toJson(): string;
}

μ–΄λŠ 것이 더 λͺ…ν™•ν•˜κ²Œ λ³΄μž…λ‹ˆκΉŒ?

λͺ¨λ“  43 λŒ“κΈ€

μ΄κ²ƒμœΌλ‘œ 무엇을 μ„±μ·¨ν•˜κ³  μ‹ΆμŠ΅λ‹ˆκΉŒ? μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

abstract μˆ˜μ—…μ΄ 당신이 μ°Ύκ³ μžˆλŠ” 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

ν—‰ν—‰
예:

interface JsonSerializable {
      public static fromJson(obj: any);
      public toJson(): string;
}

@rozzzly 이 μ˜ˆμ—μ„œ abstract class λŠ” μœ νš¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 κ½€ λ©‹μ§ˆ 것이라고 μƒκ°ν•œλ‹€! JavaλŠ” λ§ˆμ§€λ§‰ λ²„μ „μ—μ„œμ΄ κΈ°λŠ₯을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

μ„Έλ₯΄μ§€ 뉴
λ‚˜λŠ” 당신이 이것이 ν₯미둜울 것이라고 μƒκ°ν•œλ‹€.

interface JsonSerializableStatic<C extends new (...args) => JsonSerializable<C>> {
  fromJson(json: string): JsonSerializable<C>;
}

interface JsonSerializable<C extends new (...args) => any> {
  toJson: () => string;
  constructor: C;
}

interface A extends JsonSerializable<typeof A> { }
class A implements JsonSerializable<typeof A> {

  constructor(readonly id: number, readonly name: string) { }
  toJson() { return JSON.stringify(this); }

  static fromJson(json: string): A {
    const obj = JSON.parse(json);
    return new A(obj.id, obj.name);
  }
}

const a = new A(1, 'Charlize');

const json = a.toJson();

const y = A.fromJson(json);
console.info(a, json, y);
console.info(new a.constructor(1, 'Theron'));
const m = new A.prototype.constructor(1, 'Charlize Theron');
console.info(m);

@aluanhaddad λ‚˜λŠ” λ‹Ήμ‹ μ˜ μ½”λ“œκ°€ λͺ…λ°±ν•œ 문제의 ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

interface JsonSerializable {
      public static fromJson(obj: any);
      public toJson(): string;
}

μ–΄λŠ 것이 더 λͺ…ν™•ν•˜κ²Œ λ³΄μž…λ‹ˆκΉŒ?

@aluanhaddad λ‚˜λŠ” λ‹Ήμ‹ μ˜ μ½”λ“œκ°€ λͺ…λ°±ν•œ 문제의 ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

interface JsonSerializable {
public static fromJson (obj : any);
public toJson () : λ¬Έμžμ—΄;
}
μ–΄λŠ 것이 더 λͺ…ν™•ν•˜κ²Œ λ³΄μž…λ‹ˆκΉŒ?

사싀, κ·ΈλŸ¬λ‚˜ λ‚΄ 것은 ν•΄κ²° 방법이 μ•„λ‹ˆλ©° μ‚¬μš© 사둀에 λŒ€ν•œ μ •λ‹Ήν™”μž…λ‹ˆλ‹€. 정적 μ—­ 직렬화 및 μΈμŠ€ν„΄μŠ€ 직렬화가 ν΄λž˜μŠ€λ³„λ‘œ κ΅¬ν˜„λ˜μ–΄ μΊ‘μŠν™”λ˜κ³  ν˜•μ‹μ΄ μ•ˆμ „ν•©λ‹ˆλ‹€.
κ·€ν•˜μ˜ μ„ μ–Έ :

interface JsonSerializable {
     public static fromJson(obj: any);
     public toJson(): string;
}

기본적으둜 JSON 객체의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ‹€μ‹œ μ„ μ–Έν•˜λ―€λ‘œ 관련이 μ—†μŠ΅λ‹ˆλ‹€. μ–΄λ–€ 식 μœΌλ‘œλ“  정적 μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œκ°€ μ ˆλŒ€μ μœΌλ‘œ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ˜ κ°œλ…μ„ μžƒμ–΄ 버리고 μžˆμŠ΅λ‹ˆλ‹€. class A implements JsonSerializable 두 가지 방법을 λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ‹€μ œλ‘œ λ‚˜λ₯Ό κ΅¬ν˜„ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

toJson: () => string;
constructor: new (...args) => JsonSerializableStatic<C>;

λͺ…ν™•ν•œ 해결책이 μ•„λ‹™λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 정적 λ©”μ†Œλ“œλ₯Ό μ •μ˜ ν•  μˆ˜μ—†λŠ” 기술적 μ΄μœ λŠ” μ—†μŠ΅λ‹ˆλ‹€.

@Serginho λ‚˜λŠ” 상황이 이상적이라고 μ£Όμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것이 ν‘œν˜„ 될 수 μžˆλ‹€λŠ” 것을 μ„€λͺ…ν•˜λ €κ³  λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€.

νŠΈμœ— λ‹΄μ•„ κ°€κΈ° λ§ˆμŒμ„ μ—΄μ–΄ 라. typescriptκ°€ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ 정적 λ©”μ„œλ“œλ₯Ό ν—ˆμš©ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? 이것은 λ§ˆμ§€λ§‰ λ²„μ „μ˜ Java 8μ—μ„œ κ΅¬ν˜„λ˜μ—ˆμœΌλ―€λ‘œ 말도 μ•ˆλ˜λŠ” μ†Œλ¦¬κ°€ μ•„λ‹™λ‹ˆλ‹€.

@Serginho μ €λŠ”

@aluanhaddadκ°€ 이미 μž‘μ„±ν–ˆλ“―μ΄

λ§ˆμŒμ„ μ—΄κ³  λ‹€λ₯Έ μŠ€νƒ€μΌμ˜ ν”„λ‘œκ·Έλž˜λ°μ„ μ‹œλ„ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 세상은 OOP둜 μ‹œμž‘ν•˜κ±°λ‚˜ λλ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜, 일반 객체 및 (그리고 μ–΄λŠ μ •λ„λŠ”) ν”„λ‘œν†  νƒ€μž…μ„ μ‚¬μš©ν•œ ν”„λ‘œκ·Έλž˜λ°μ΄ 즐겁고 훨씬 더 μ’‹μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μŠ€νƒ€μΌμ€ JavaScriptκ°€ μ²˜μŒμ— μ„€κ³„λœ 것과 훨씬 더 μΌμΉ˜ν•©λ‹ˆλ‹€. 참고둜, JSκ°€ (μ μ–΄λ„μœ„μ›νšŒ μˆ˜μ€€μ—μ„œλŠ”) OOP-esque νŒ¨ν„΄μœΌλ‘œ 천천히 μ΄λ™ν•˜κ³  μžˆλ‹€λŠ” 데 λ™μ˜ν•˜μ§€λ§Œ, λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„κ³Ό 개발 κΈ°μˆ μ— μ΅μˆ™ν•˜μ§€ μ•Šμ€ μ‚¬λžŒλ“€μ˜ μ—„μ²­λ‚œ μ••λ°• λ•Œλ¬Έμž…λ‹ˆλ‹€. μ €μ—κ²Œ 그것은 맀우 μŠ¬ν”„κ³  μ‹€λ§μŠ€λŸ¬μš΄ μΌμž…λ‹ˆλ‹€.

@gcnewκ°€ λ§ν–ˆλ“―μ΄ μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€κ°€ μ•„λ‹Œ κ°œλ³„ 객체의 λͺ¨μ–‘을 μ„€λͺ…ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν΄λž˜μŠ€λ„ 객체이기 λ•Œλ¬Έμ— 클래슀 자체의 λͺ¨μ–‘을 μ„€λͺ…ν•˜λŠ” 데 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  μˆ˜μ—†λŠ” μ΄μœ λŠ” μ—†μŠ΅λ‹ˆλ‹€.

import assert = require("assert");

interface JsonSerializableStatic<JsonType, InstanceType extends JsonSerializable<JsonType>> {
    fromJson(obj: JsonType): InstanceType;
}
interface JsonSerializable<JsonType> {
    toJson(): JsonType;
}

interface PointJson { x: number; y: number; }
class Point /*static implements JsonSerializableStatic<PointJson, Point>*/ {
    static fromJson(obj: PointJson): Point {
        return new Point(obj.x, obj.y)
    }

    constructor(readonly x: number, readonly y: number) {}

    toJson(): PointJson {
        return { x: this.x, y: this.y };
    }
}
// Hack for 'static implements'
const _: JsonSerializableStatic<PointJson, Point> = Point;

function testSerialization<JsonType, InstanceType extends JsonSerializable<JsonType>>(cls: JsonSerializableStatic<JsonType, InstanceType>, json: JsonType) {
    const instance: InstanceType = cls.fromJson(json);
    const outJson: JsonType = instance.toJson();
    assert.deepEqual(json, outJson);
}
testSerialization(Point, { x: 1, y: 2 });

toJson λ˜λŠ” fromJson 의 μ„œλͺ…을 μΆ©μ‘±ν•˜μ§€ λͺ»ν•˜λ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. (λΆˆν–‰νžˆλ„ 였λ₯˜λŠ” λ©”μ„œλ“œκ°€ μ•„λ‹Œ const _ μžˆμŠ΅λ‹ˆλ‹€.)

μ•„λ§ˆλ„ κ΄€λ ¨μ΄μžˆμ„ κ²ƒμž…λ‹ˆλ‹€ (정적 λ©”μ†Œλ“œ μž…λ ₯을 닀루기 λ•Œλ¬Έμ—) : # 5863.


@aluanhaddad : μ˜ˆμ œμ— 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. JsonSerializable 의 constructor λ©€λ²„λŠ” μ‹€μ œλ‘œ constructor λΌλŠ” μΈμŠ€ν„΄μŠ€ 속성을 μ°Έμ‘°ν•˜λ©° new ν˜ΈμΆœν•˜λ©΄ JsonSerializableStatic λ°˜ν™˜ν•©λ‹ˆλ‹€. 이것이 μ˜λ―Έν•˜λŠ” λ°”λŠ” (new ((new X()).constructor)).fromJson({}) κ°€ μž‘λ™ν•΄μ•Όν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ„±κ³΅μ μœΌλ‘œ μ»΄νŒŒμΌλ˜λŠ” μ΄μœ λŠ” interface A extends JsonSerializable<typeof A> κ°€ μ‹€μ œλ‘œ ν™•μΈν•˜μ§€ μ•Šκ³  κ΅¬ν˜„μ΄ μœ νš¨ν•˜λ‹€κ³ 

interface I { m(): void; }
interface A extends I { }
// No compile error
class A implements I { em() {} }

@Serginho Java μ‚¬μš©μžλŠ” μ•„λ‹ˆμ§€λ§Œ μ–Έμ–΄κ°€ 클래슀의 정적 츑면에 λŒ€ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ ν•  μˆ˜μžˆλŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€ (μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ μ€€μˆ˜ν•˜λ €λ©΄ 정적 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함을 의미 함). Javaλ₯Ό μ‚¬μš©ν•˜λ©΄ μΈν„°νŽ˜μ΄μŠ€ 의 λ³Έλ¬Έ 을 μ‚¬μš©ν•˜μ—¬ 정적 λ©”μ„œλ“œλ₯Ό μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. TypeScriptλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

interface I { ... }
namespace I {
   export function interfaceStaticMethod() {}
}

일반 곡μž₯을 λ§Œλ“€λ €κ³ ν•œλ‹€λ©΄ μ–΄λ–¨κΉŒμš”?

interface Factorizable {
  static factory<U>(str: string): U
}

class Foo {
  private data: string[] = []
  bar<T extends Factorizable>(): T[] {
    return this.data.map(T.factory);
  }
}

class Bar implements Factorizable {
  static factory(str: string): Bar {
    // ...
  }
}

// Usage
var x = new Foo();
var y: Bar[] = x.bar();

μ—¬κΈ°μ„œ μ œμ•ˆν•˜λŠ” interface ꡬ문에 λŒ€ν•΄ 잘 λͺ¨λ₯΄κ² μ§€λ§Œ "μ‚¬μš©"ꡬ문이 λ‚΄κ°€ λ‹¬μ„±ν•˜λ €λŠ” κ²ƒμž„μ„ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚΄κ°€ Swiftμ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μ΄λ©° ( protocols ) TypeScriptμ—μ„œ 정말 쒋을 것이라고 μƒκ°ν•©λ‹ˆλ‹€. μ–Έμ–΄ λ””μžμ΄λ„ˆ λ‚˜ 컴파일러 κ΅¬ν˜„μžλŠ” μ•„λ‹ˆμ§€λ§Œ TypeScript의 μ˜λ„ ν•œ λ°©ν–₯에 λ§žλŠ”μ§€ λ˜λŠ” κ΅¬ν˜„ν•˜κΈ°μ— ν˜„μ‹€μ μΈμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό implement ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κΈ° λ§Œν•˜λ©΄ ꡬ쑰적 μœ ν˜• 검사가 μ‚¬μš© μ‚¬μ΄νŠΈμ˜ λͺ¨λ“  문제λ₯Ό μΊμ‹œν•©λ‹ˆλ‹€. 예 :

interface Factorizable<U> {
    factory(str: string): U
}

class Foo {
  private data: string[] = []
  bar<T>(factory: Factorizable<T>): T[] {
    return this.data.map(factory.factory);
  }
}

class Bar {
  static factory(str: string): Bar {
    // ...
  }
}

// Usage
var x = new Foo();
var y = x.bar(Bar); // Bar[]

@mhegazy λŠ” 비ꡐ적 쒋은 μ†”λ£¨μ…˜μž…λ‹ˆλ‹€. μ œκ³΅ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! πŸ™

μ—¬μ „νžˆ λ‚˜μ—κ²Œ 뢈편 ν•¨μ„μ£ΌλŠ” 두 가지가 μžˆμŠ΅λ‹ˆλ‹€ (λΆ„λͺ…νžˆ μ‡Ό μŠ€ν† νΌκ°€ μ•„λ‹™λ‹ˆλ‹€).

  1. Bar 이 Factorizable λ₯Ό λͺ…μ‹œ 적으둜 κ΅¬ν˜„ν•˜κ±°λ‚˜ μ€€μˆ˜ν•œλ‹€κ³  μ—¬μ „νžˆ μ„ μ–Έ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

    • μ‹€μ œλ‘œλŠ” 이것이 μ‹€μ œλ‘œ λ¬Έμ œκ°€λ˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. Factorizable μΈν„°νŽ˜μ΄μŠ€κ°€ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” λ°©μ‹μœΌλ‘œ λ³€κ²½λ˜λ©΄ x.bar(Bar) 에 였λ₯˜κ°€ λ°œμƒν•˜κΈ° μ‹œμž‘ν•˜κ³  λ“œλ¦¬ν”„νŠΈ λ³€κ²½ 사항을 μˆ˜μ •ν•˜λŠ” 것이 사싀이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  2. μ €μ—κ²ŒλŠ” 과제 였λ₯Έμͺ½μ— y μœ ν˜•μ„ μ„ μ–Έν•˜λŠ” 것이 μ—¬μ „νžˆμΈμ§€ 적 λΆ€λ‹΄μž…λ‹ˆλ‹€.

    • 더 μ΄μƒν•˜κ²Œμ΄ ꡬ문은 var y: Baz[] = x.bar(Bar) λ™μž‘μ„ κ°€λŠ₯ν•˜κ²Œν•©λ‹ˆλ‹€. λΆ„λͺ…νžˆ 였λ₯˜μ΄μ§€λ§Œ ꡬ문은 κ°œλ°œμžκ°€ 두 μœ„μΉ˜μ—μ„œ λ°˜ν™˜ μœ ν˜•μ„ μ •μ˜ν•˜μ—¬ 문제λ₯Ό κ³Όλ„ν•˜κ²Œ μ œν•œ ν•  수 μžˆλ„λ‘ν•©λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ—¬μ „νžˆ Barκ°€ Factorizable을 λͺ…μ‹œ 적으둜 κ΅¬ν˜„ν•˜κ±°λ‚˜ μ€€μˆ˜ν•œλ‹€κ³  μ„ μ–Έ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

κ΄€λ ¨λœ 두 가지 μœ ν˜•μ΄ μžˆμŠ΅λ‹ˆλ‹€. 1. μƒμ„±μž ν•¨μˆ˜ (예 : 클래슀의 정적 μΈ‘) 및 2. μΈμŠ€ν„΄μŠ€ μΈ‘ ( new 호좜 ν•  λ•Œ λ‚˜μ˜€λŠ” 것). 이 두 가지λ₯Ό ν•˜λ‚˜μ˜ μœ ν˜•μœΌλ‘œ ν˜Όν•©ν•˜λŠ” 것은 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ‘ μ μœΌλ‘œλŠ” implements 및 static implements μžˆμ§€λ§Œ μ‹€μ œλ‘œλŠ” μ–ΈκΈ‰ν–ˆλ“―μ΄ 거의 μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ©° κ΅¬ν˜„ μ ˆμ€ μ‹€μ œλ‘œ 많이 μΆ”κ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. implements 쑰항이 μžˆλŠ”μ§€ 여뢀와 관계없이 μ‚¬μš© μ‚¬μ΄νŠΈμ—μ„œ 확인이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

λ‚˜μ—κ²ŒλŠ” 과제의 였λ₯Έμͺ½μ— y μœ ν˜•μ„ μ„ μ–Έν•˜λŠ” 것이 μ—¬μ „νžˆμΈμ§€ 적 λΆ€λ‹΄μž…λ‹ˆλ‹€.

두 가지 μƒμ΄ν•œ 평균, var y = x.bar(Bar) μƒˆλ‘œμš΄ λ³€μˆ˜λ₯Ό μ„ μ–Έ y 같은 νƒ€μž… x.bar(Bar) ; μ—¬κΈ°μ„œ 같이 var y: Bar[] = x.bar(Bar) μƒˆλ‘œμš΄ λ³€μˆ˜ μ„ μ–Έ y μœ ν˜• Bar[] μœ ν˜• 있고λ₯Ό 검증 x.bar(Bar) 귀속 인 Bar[] .

siadκ°€ 있으면 이것은 였히렀 μŠ€νƒ€μΌ λ¬Έμ œμž…λ‹ˆλ‹€. 개인적으둜 ν•„μžλŠ” κΌ­ ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ λͺ…μ‹œ 적으둜 μœ ν˜• 주석을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μœ ν˜•μ΄ μ‹œμŠ€ν…œμ„ 톡해 흐λ₯΄κ²Œν•˜μ‹­μ‹œμ˜€. κ·ΈλŸ¬λ‚˜ μŠ€νƒ€μΌ κ°€μ΄λ“œκ°€ λ°˜λŒ€ 인 μ½”λ“œλ² μ΄μŠ€λ₯Ό λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λͺ¨λ“  것이 λͺ…μ‹œμ μΈ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

@mhegazy ν† λ‘  / 관점에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

@ andy-hanson μ‹œκ°„μ„λ‚΄μ–΄ μˆ˜μ • ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. λ‚΄ μ˜ˆμ—μ„œ 였λ₯˜λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

이것은 λ˜ν•œ μž‘λ™ν•˜λ©° μΆ”κ°€ ν•¨μˆ˜ ν˜ΈμΆœμ—†μ΄ 컴파일 νƒ€μž„μ— 였λ₯˜λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

interface Type<T> {
    new (...args: any[]): T;
}

/* static interface declaration */
interface ComparableStatic<T> extends Type<Comparable<T>> {
    compare(a: T, b: T): number;
}

/* interface declaration */
interface Comparable<T> {
    compare(a: T): number;
}

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

@staticImplements<ComparableStatic<TableCell>>()   /* this statement implements both normal interface & static interface */
class TableCell { /* implements Comparable<TableCell> { */  /* not required. become optional */
    value: number;

    compare(a: TableCell): number {
        return this.value - a.value;
    }

    static compare(a: TableCell, b: TableCell): number {
        return a.value - b.value;
    }
}

ν† λ‘ μ˜ κ²°κ³ΌλŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λ‚˜λŠ” 이것을 λ§Œλ‚¬κ³  static interface 도 μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

interface IDb {
  public static instance: () => Db,
}

λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ€ μƒμ„±μž ν•¨μˆ˜ / ν΄λž˜μŠ€μ— 이미 μƒμ„±μž μΈν„°νŽ˜μ΄μŠ€μ™€ μΈμŠ€ν„΄μŠ€ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 두 개의 μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€λŠ” μ˜λ―Έμ—μ„œ 이미 _static_ μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€λŠ” 것을 μžŠμ–΄ λ²„λ¦½λ‹ˆλ‹€.

interface MyFoo {
  method(): void;
}

interface MyFooConstructor {
  new (): MyFoo;
  prototype: MyFoo;
  staticMethod(): any;
}

const MyFoo = function MyFoo() {
  this.prop = '';
} as any as MyFooConstructor;

MyFoo.prototype = {
  method() { console.log(this); }
}

MyFoo.staticMethod = function () { /* do something static */ }

_abstract_ 클래슀λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우 이미 κΆŒν•œμ΄μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹΅μž₯ ν•΄μ£Όμ‹  @kitsonk μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

κ·€ν•˜μ˜ 선언이 μž‘λ™ν•΄μ•Όν•˜λŠ” 것 κ°™μ§€λ§Œ 사둀에 λΉ„ν•΄ λ„ˆλ¬΄ μž₯ν™©ν•©λ‹ˆλ‹€.

그리고 방금 _abstract_ 클래슀λ₯Ό μ‹œλ„ν–ˆμ§€λ§Œ static 와 ν•¨κ»˜ abstract static λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

[ts] 'static' modifier cannot be used with 'abstract' modifier.

@zixia 문제 # 14600

λ„€, νˆ¬ν‘œν•©μ‹œλ‹€.

아무도 λ‚΄ μ§ˆλ¬Έμ— λŒ€ν•œ ν•΄κ²°μ±…μœΌλ‘œ λ‹΅μž₯을 λ³΄λ‚΄μ‹œκ² μŠ΅λ‹ˆκΉŒ? http://stackoverflow.com/questions/44047874/dynamically-modify-typescript-classes-through-a-generic-function

μΈν„°νŽ˜μ΄μŠ€μ— 정적 멀버λ₯Ό 지정할 수 있으면 전체 λ¬Έμ œκ°€ ν•΄κ²° 될 것이라고 μƒκ°ν•˜λ©°,이 λ¬Έμ œκ°€ ν•„μš” ν•˜μ§€ μ•Šμ•„ μ’…κ²°λ˜λ©΄ λŒ€μ‹  ν•΄κ²° 방법을보고 μ‹ΆμŠ΅λ‹ˆλ‹€.

@grantila κ·€ν•˜μ˜ μ§ˆλ¬Έμ— λ‹΅λ³€ν–ˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œμ—μ„œ 이전에 μ–ΈκΈ‰ν–ˆλ“―μ΄ 여기에 μ–ΈκΈ‰λ˜μ§€ μ•Šμ€ μΆ”κ°€ μš”κ΅¬ 사항이 μ—†μœΌλ©΄ 클래슀λ₯Ό 객체둜 μ²˜λ¦¬ν•˜μ—¬ μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@ Enet4 μ§ˆλ¬Έμ„ μ—…λ°μ΄νŠΈ Object.defineProperty() ν•΄ν‚ΉμœΌλ‘œλŠ” μ‹€μ œ 문제λ₯Ό ν•΄κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ–΄λŠ btw λŠ” ν•΄ν‚Ήμž…λ‹ˆλ‹€. 기본적으둜 μ μ ˆν•œ 정적 검사 인 make μ² μžκ°€ 틀리지 μ•Šλ„λ‘ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

이것은 λ‚΄κ°€ 가진 μ§„μ§œ λ¬Έμ œμž…λ‹ˆλ‹€. TypeScript둜 ν¬νŒ…ν•˜κΈ° μ‹œμž‘ν–ˆμ§€λ§Œ μ§€κΈˆμ€ μžλ°” 슀크립트둜 μœ μ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ ν•„μš”ν–ˆλ˜ μ—„μ²­λ‚œ μ–‘μ˜ μ½”λ“œλ₯Ό 재 μž‘μ„±ν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

기본적으둜 μ μ ˆν•œ 정적 검사-μ² μžκ°€ 틀리지 μ•Šλ„λ‘ 보μž₯ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

정적 κ²€μ‚¬λŠ” μ—¬κΈ°κΉŒμ§€λ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ§€κΈˆ μœ μΌν•œ 관심사가 μ˜¬λ°”λ₯Έ 속성을 μ„€μ •ν•˜λŠ” 것이라면 μ œμž‘μž μœ ν˜•μœΌλ‘œ μΊμŠ€νŒ…ν•˜κ³  κ±°κΈ°μ—μ„œ 속성을 μ„€μ •ν•˜λŠ” 것이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

@ Enet4 λŠ” μž‘λ™ν•˜λŠ” μ†”λ£¨μ…˜μž…λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€. 이 문제 (13462)λ₯Ό λ‹€μ‹œ μ‚΄νŽ΄λ³΄μ•„μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μœ ν˜• μΊμŠ€νŒ…μ„ μ‚¬μš©ν•˜λŠ” κ·€ν•˜μ™€ 같은 μ†”λ£¨μ…˜μ€ μ‹€μ œλ‘œ μœ ν˜• μ•ˆμ „ν•˜μ§€ μ•ŠμœΌλ©° 이것이 클래슀 μœ ν˜•μ„ κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 상황을 ν•΄κ²°ν•˜λŠ” μœ μΌν•œ 방법이라면 동적 μ–Έμ–΄μ˜ μœ μ—°μ„±μ„ 많이 μƒμ‹€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

νƒ€μž… μΊμŠ€νŒ…μ„ μ‚¬μš©ν•˜λŠ” λ‹Ήμ‹ κ³Ό 같은 μ†”λ£¨μ…˜μ€ μ‹€μ œλ‘œ νƒ€μž… μ•ˆμ „ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 이것이 클래슀 νƒ€μž…μ„ κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 상황을 ν•΄κ²°ν•˜λŠ” μœ μΌν•œ 방법이라면, μš°λ¦¬λŠ” 동적 μ–Έμ–΄μ˜ λ§Žμ€ μœ μ—°μ„±μ„ μžƒκ³  μžˆμŠ΅λ‹ˆλ‹€.

@grantila λ‚΄ λ°©μ–΄μ—μ„œ 그것은 λ…ΌμŸμ˜ 여지가 μžˆμŠ΅λ‹ˆλ‹€. : wink : μ‚¬μš© μ‚¬λ‘€λŠ” 클래슀 μœ ν˜•μ΄ λŸ°νƒ€μž„ 쑰건에 따라 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ±°λ‚˜ μ œκ³΅ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€λŠ” μ μ—μ„œμ΄ λ¬Έμ œμ— μ œμ‹œλœ 사둀와 λ‹€λ¦…λ‹ˆλ‹€. 그리고 λ‚΄ λŒ€λ‹΅μ— μ œμ‹œλœ μœ ν˜• μΊμŠ€νŠΈλ³΄λ‹€ 더 μ•ˆμ „ν•˜μ§€ μ•Šμ€ IMOλŠ” 객체에 ν•„λ“œλ₯Ό μ‚½μž… ν•  수 μžˆλ„λ‘ μˆ˜ν–‰λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 그런 μ˜λ―Έμ—μ„œ κ²°κ³Ό 클래슀 μœ ν˜• C & Maker<T> λŠ” C 에 μ˜μ‘΄ν•˜λŠ” λ‹€λ₯Έ λͺ¨λ“  것과 ν˜Έν™˜λ˜μ–΄μ•Όν•©λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ 정적 λ©”μ„œλ“œκ°€ μ—¬κΈ°μ„œ 도움이 될 μˆ˜μžˆλŠ” 곳을 상상해 λ³΄μ•˜μ§€λ§Œ λ­”κ°€ λˆ„λ½λ˜μ—ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μΈν„°νŽ˜μ΄μŠ€μ— static make?(... args: any[]): self 와 같은 것이 μžˆλ”λΌλ„ 호좜 전에 λŸ°νƒ€μž„μ—μ„œ 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•΄μ•Όν•©λ‹ˆλ‹€. 이 토둠을 κ³„μ†ν•˜κ³  μ‹Άλ‹€λ©΄ μ†ŒμŒμ„ 쀄이기 μœ„ν•΄ λ‹€λ₯Έ κ³³μ—μ„œ κ·Έλ ‡κ²Œν•˜λŠ” 것을 κ³ λ €ν•΄ λ΄…μ‹œλ‹€. : slightly_smiling_face :

κ·Έλ ‡λ‹€λ©΄ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μœ ν˜• 검사 ν•  수 μ—†μŠ΅λ‹ˆκΉŒ?

λ‚΄ μ‚¬μš© μ‚¬λ‘€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

interface IObject {
    static make(s: string): IObject;
}

class A implements IObject{
    static make(s: string): IObject {
        // Implementation A...
    }
}

class B implements IObject{
    static make(s: string): IObject {
        // Implementation B...
    }
}

A.make("string"); // returns A
B.make("string"); // returns B

λ‚˜λŠ” 이것을 μœ„ν•΄ μƒˆλ‘œμš΄ νŒ©ν† λ¦¬ 클래슀λ₯Ό μž‘μ„±ν•˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.

@ tyteen4a03 ν•΄λ‹Ή μ˜ˆμ œμ—μ„œ IObject λ₯Ό μ œκ±°ν•˜λ©΄ μ»΄νŒŒμΌλ©λ‹ˆλ‹€. https://github.com/Microsoft/TypeScript/issues/17545#issuecomment -319422545도

@ andy-ms 예, λΆ„λͺ…νžˆ μž‘λ™ν•˜μ§€λ§Œ μœ ν˜• κ²€μ‚¬μ˜ 전체 μš”μ μ€ μœ ν˜• κ²€μ‚¬μž…λ‹ˆλ‹€. λͺ¨λ“  μ‚¬μš© 사둀λ₯Ό 컴파일 ν•  μˆ˜μžˆμ„λ§ŒνΌ 항상 ν˜•μ‹ μ•ˆμ „μ„±μ„ μ €ν•˜μ‹œν‚¬ 수 μžˆμ§€λ§Œ, μ΄λŠ” 이것이 κΈ°λŠ₯ μš”μ²­μ΄κ³  그닀지 미친 것이 μ•„λ‹ˆλΌλŠ” 사싀을 λ¬΄μ‹œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

예, λΆ„λͺ…νžˆ μž‘λ™ν•˜μ§€λ§Œ μœ ν˜• κ²€μ‚¬μ˜ 전체 μš”μ μ€ μœ ν˜•μ„ κ²€μ‚¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이것은 클래슀의 정적 츑이 μΈμŠ€ν„΄μŠ€ 츑에 λŒ€ν•œ λ³„λ„μ˜ μΈν„°νŽ˜μ΄μŠ€μ΄κ³  implements κ°€ μΈμŠ€ν„΄μŠ€ 츑을 κ°€λ¦¬ν‚€λŠ” 방법에 λŒ€ν•œ κΈΈκ³  κΈ΄ μŠ€λ ˆλ“œμž…λ‹ˆλ‹€. @ andy-msλŠ” @ tyteen4a03 μ—κ²Œ μ½”λ“œ 슀 λ‹ˆνŽ«μ„ μž‘λ™μ‹œν‚€λŠ” 방법을 μ•Œλ €μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. μœ ν˜• 검사λ₯Ό ν¬κΈ°ν•˜λŠ” 것이 μ•„λ‹ˆλΌ _wrong_ μ΄μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

정적 λ©”μ„œλ“œκ°€ 클래슀 μ œλ„€λ¦­ 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν—ˆμš©ν•˜λŠ” μ‚¬μš© μ‚¬λ‘€λŠ” mixin ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 주석을 μ‚¬μš©ν•˜μ—¬ μ—΄, λ°μ΄ν„°λ² μ΄μŠ€ 등을 μ •μ˜ν•˜λŠ” μ—”ν‹°ν‹° ν”„λ ˆμž„ μ›Œν¬λ₯Ό ꡬ좕 쀑이며 μ˜¬λ°”λ₯Έ μœ ν˜•μ˜ μ €μž₯μ†Œμ— λŒ€ν•œ νŽΈλ¦¬ν•œ μ•‘μ„ΈμŠ€λ₯Ό ν—ˆμš©ν•˜λŠ” 정적 ν•¨μˆ˜λ₯Ό μ—”ν‹°ν‹° ν΄λž˜μŠ€μ— ν˜Όν•©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

class RepositoryMixin<T> {
    public static repository(): EntityRepository<T> {
        return new EntityRepository<T>(Object.getPrototypeOf(this));
    }
}

@mixin(RepositoryMixin)
class Entity implements RepositoryMixin<Entity> {
    public id: number;
}

Entity.repository().save(new Entity());

@rmblstrp μ˜ˆμ œμ—μ„œ μ œμ•ˆ 된 κΈ°λŠ₯을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ 보여쀄 수 μžˆμŠ΅λ‹ˆκΉŒ? 가급적 검증 κ°€λŠ₯ν•œ κ²ƒμœΌλ‘œ?

이 κΈ°λŠ₯이 ν•„μš”ν•˜μ§€ μ•Šμ€ @rmblstrp . 사싀, λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμ— 주석이 달린 ν΄λž˜μŠ€κ°€ ν•„μš”ν•œ 정적 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ‹€μ œλ‘œ _its type_ 일 수 μžˆμŠ΅λ‹ˆλ‹€. λ‘˜ λ‹€ ν•„μš”ν•˜μ§€ μ•ŠμœΌλ©° μ‹€μ œλ‘œ μ€‘λ³΅λ©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” 주제λ₯Ό λ²—μ–΄λ‚˜κ±°λ‚˜μ΄ λŒ€ν™”μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜κ³  싢지 μ•ŠμŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ„ λ…Όμ˜ν–ˆκΈ° λ•Œλ¬Έμ— (OOP λ˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•΄μ•Όν•©λ‹ˆκΉŒ?), 일반적으둜 db에 λŒ€ν•œ 연결을 μƒμ„±ν•˜κ±°λ‚˜ μΌμ’…μ˜ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 정적 νŒ©ν† λ¦¬μ— λŒ€ν•΄ ꡬ체적으둜 μ΄μ•ΌκΈ°ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.
PHP 및 Java와 같은 λ§Žμ€ μ–Έμ–΄μ—μ„œ 정적 νŒ©ν† λ¦¬λŠ” μ˜μ‘΄μ„± μ£Όμž…μ„ μœ„ν•΄ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€. 쒅속성 μ£Όμž… 및 IOC μ»¨ν…Œμ΄λ„ˆλŠ” Symfony 및 Springκ³Ό 같은 ν”„λ ˆμž„ μ›Œν¬ 덕뢄에 λŒ€μ€‘ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
Typescriptμ—λŠ” InversifyJSλΌλŠ” 멋진 IOC μ»¨ν…Œμ΄λ„ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

이 νŒŒμΌμ€ 전체가 μ–΄λ–»κ²Œ μ²˜λ¦¬λ˜λŠ”μ§€ λ³Ό μˆ˜μžˆλŠ” νŒŒμΌμž…λ‹ˆλ‹€.
https://github.com/Deviad/virtual-life/blob/master/models/generic.ts
https://github.com/Deviad/virtual-life/blob/master/service/user.ts
https://github.com/Deviad/virtual-life/blob/master/models/user.ts
https://github.com/Deviad/virtual-life/blob/master/utils/sqldb/client.ts
https://github.com/Deviad/virtual-life/blob/master/bootstrap.ts

μ™„λ²½ν•œ μ†”λ£¨μ…˜μ΄λΌκ³  λ§ν•˜λŠ” 것은 μ•„λ‹ˆμ§€λ§Œ (μ•„λ§ˆλ„ 일뢀 μ‹œλ‚˜λ¦¬μ˜€κ°€ λ“œλŸ¬λ‚˜μ§€ μ•Šμ€ μƒνƒœλ‘œ λ‚¨μŠ΅λ‹ˆλ‹€) Reactμ—μ„œλ„ μž‘λ™ν•©λ‹ˆλ‹€. 이미 μ‚΄νŽ΄λ³Ό μˆ˜μžˆλŠ” λͺ‡ 가지 μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, μ–΄λŠ 것이 더 λ‚˜μ€μ§€μ— λŒ€ν•œμ΄ 츑면을 λ‹€λ£¨λŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œμ΄ λΉ„λ””μ˜€λ₯Ό λ³Ό 것을 μ œμ•ˆν•©λ‹ˆλ‹€ : https://www.youtube.com/watch?v=e-5obm1G_FY&t=1487s
슀포일러 : 더 λ‚˜μ€ μ‚¬λžŒμ€ μ—†μŠ΅λ‹ˆλ‹€. ν•΄κ²°ν•˜λ €λŠ” λ¬Έμ œμ— 따라 λ‹€λ¦…λ‹ˆλ‹€. μ‚¬μš©μž, ꡐ싀, ꡐ사λ₯Ό λ‹€λ£¨λŠ” 경우 OOPλŠ” 개체λ₯Ό μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό λͺ¨λΈλ§ν•˜λŠ” 것이 더 μ’‹μŠ΅λ‹ˆλ‹€.
μ›Ή μ‚¬μ΄νŠΈλ₯Ό μŠ€μΊ”ν•˜λŠ” νŒŒμ„œκ°€ ν•„μš”ν•œ 경우 λΆ€λΆ„ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜ 생성기λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 κΈ°λŠ₯적 일 수 μžˆμŠ΅λ‹ˆλ‹€. :)

@Deviad @aluanhaddad λ‚΄ κ²Œμ‹œλ¬Ό 이후 InversifyJSλ₯Ό μ‚¬μš©ν•΄ μ™”μœΌλ©° μ ˆλŒ€μ μœΌλ‘œ ν›Œλ₯­ν•˜κ³  ν™•μ‹€νžˆ 훨씬 더 λ‚˜μ€ λ°©λ²•μ΄μ—ˆμŠ΅λ‹ˆλ‹€. λ‚΄ κ²Œμ‹œλ¬Ό λ‹Ήμ‹œμ—λŠ” 이전에 PHP / C #을 μ‚¬μš©ν•œ ν›„ Typescript / Nodeλ₯Ό μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€. ν™˜κ²½κ³Ό μ‚¬μš© κ°€λŠ₯ν•œ νŒ¨ν‚€μ§€μ— μ΅μˆ™ν•΄μ§€λŠ” 데 μ•½κ°„μ˜ μ‹œκ°„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€.

μ΄κ²ƒμ˜ μƒνƒœλŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? λ¦¬ν¬μ§€ν† λ¦¬μ—μ„œ ν•΄κ²°λ˜μ§€ μ•Šμ€ 문제λ₯Ό 계속 λ‹«λŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μΈν„°νŽ˜μ΄μŠ€μ— 정적 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 선택은 λ””μžμΈμ— 따라 λ¬Έμ œκ°€ λͺ…μ‹œ 적으둜 "wontfix"둜 ν‘œμ‹œλ˜μ–΄μ•Όν•˜λŠ” 경우 쀑 ν•˜λ‚˜λΌκ³  μƒκ°ν•©λ‹ˆλ‹€.

@ enet4 , λ‚˜λŠ” μƒˆλ‘œ 온 μ‚¬λžŒμ΄μ§€λ§Œ μ „ν˜€ λͺ…ν™•ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 이 문제 및 기타 κ΄€λ ¨ 문제λ₯Ό 읽으면 λŒ€λΆ€λΆ„ λ‹€μŒ 문제처럼 λ“€λ¦½λ‹ˆλ‹€.

A. μ–΄λ ΅λ‹€
B. μš°λ¦¬λŠ” μ§€κΈˆκΉŒμ§€ λ³Έ (각각) νŠΉμ • ꡬ문을 μ’‹μ•„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
C. μ†Œμˆ˜λŠ” 그것이 μ „ν˜€ κ°€λŠ₯ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜μ§€ μ•Šκ³  였히렀 ν˜„μž¬μ˜ μ΄μƒν•œ 방법을 μ‚­μ œν•©λ‹ˆλ‹€.

μ‹€μ œλ‘œ μ˜λ„μ μœΌλ‘œ μ„€κ³„λœ 것이고 λ‹΄λ‹Ήμžκ°€ μ›ν•˜μ§€ μ•ŠλŠ” 경우 곡개 λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜κ³ μ΄ μŠ€λ ˆλ“œμ™€ λ‹€λ₯Έ μŠ€λ ˆλ“œμ— ꡐ차 λ§ν¬ν•΄μ•Όν•©λ‹ˆλ‹€. 이것은 우리λ₯Ό 림보에 λ‘λŠ” 것보닀 λ§Žμ€ μ‹œκ°„μ„ μ ˆμ•½ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 μŠ€λ ˆλ“œμ—μ„œ 이미 # 14600에 μ—°κ²°λ˜μ–΄ 있으며 이것이 κΈ°λŠ₯ μš”μ²­μ— 따라 따라야 ν•  λ¬Έμ œμž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰