TypeScript λ²μ : 2.0.3
μνΈ
interface Foo {
public static myStaticMethod(param1: any);
}
μμλλ λμ :
μ€λ₯ μμ
μ€μ νλ :
μ§μλμ§ μμ
μ΄κ²μΌλ‘ 무μμ μ±μ·¨νκ³ μΆμ΅λκΉ? μλ리μ€μ λν΄ μμΈν μ€λͺ ν΄ μ£Όμκ² μ΅λκΉ?
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 λ λΉκ΅μ μ’μ μ루μ μ λλ€. μ κ³΅ν΄ μ£Όμ μ κ°μ¬ν©λλ€! π
μ¬μ ν λμκ² λΆνΈ ν¨μμ£Όλ λ κ°μ§κ° μμ΅λλ€ (λΆλͺ ν μΌ μ€ν νΌκ° μλλλ€).
Bar
μ΄ Factorizable
λ₯Ό λͺ
μ μ μΌλ‘ ꡬννκ±°λ μ€μνλ€κ³ μ¬μ ν μ μΈ ν μ μμ΅λλ€.
Factorizable
μΈν°νμ΄μ€κ° νΈνλμ§ μλ λ°©μμΌλ‘ λ³κ²½λλ©΄ x.bar(Bar)
μ μ€λ₯κ° λ°μνκΈ° μμνκ³ λ리ννΈ λ³κ²½ μ¬νμ μμ νλ κ²μ΄ μ¬μ€μ΄κΈ° λλ¬Έμ
λλ€.μ μκ²λ κ³Όμ μ€λ₯Έμͺ½μ 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μ μ°κ²°λμ΄ μμΌλ©° μ΄κ²μ΄ κΈ°λ₯ μμ²μ λ°λΌ λ°λΌμΌ ν λ¬Έμ μ λλ€.
κ°μ₯ μ μ©ν λκΈ
@aluanhaddad λλ λΉμ μ μ½λκ° λͺ λ°±ν λ¬Έμ μ ν΄κ²° λ°©λ²μ μ°Ύμμ΅λλ€.
μ΄λ κ²μ΄ λ λͺ ννκ² λ³΄μ λκΉ?