ΠΡΠΈΠ²Π΅Ρ, ΡΠ΅Π±ΡΡΠ°, Ρ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ IoC Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ TypeScript ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ InversifyJS . Π― ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» ΠΊΠ»Π°ΡΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ TypeBinding<TServiceType>
ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ service type
(ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ) ΠΈ implementation type
(ΠΊΠ»Π°ΡΡ). ΠΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
// Defines allowed scope modes
enum TypeBindingScopeEnum {
Transient,
Singleton
}
class TypeBinding<TServiceType> {
// The runtime identifier used because at runtime
// we don't have interfaces
public runtimeIdentifier : string;
// The constructor of a class that must implement TServiceType
public implementationType : { new(): TServiceType ;};
// Cache used to allow singleton scope
public cache : TServiceType;
// The scope mode to be used
public scope : TypeBindingScopeEnum;
constructor(
runtimeIdentifier : string,
implementationType : { new(): TServiceType ;},
scopeType? : TypeBindingScopeEnum) {
this.runtimeIdentifier = runtimeIdentifier;
this.implementationType = implementationType;
this.cache = null;
if(typeof scopeType === "undefined") {
// Default scope is Transient
this.scope = TypeBindingScopeEnum.Transient;
}
else {
if(TypeBindingScopeEnum[scopeType]) {
this.scope = scopeType;
}
else {
var msg = `Invalid scope type ${scopeType}`;
throw new Error(msg);
}
}
}
}
Π― ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° TypeBinding<TServiceType>
:
interface FooInterface {
logFoo() : void;
}
interface BarInterface {
logBar() : void;
}
interface FooBarInterface {
logFooBar() : void;
}
// Notice default constructor
class Foo implements FooInterface {
public logFoo(){
console.log("foo");
}
}
// Notice default constructor
class Bar implements BarInterface {
public logBar(){
console.log("bar");
}
}
// Notice dependencies on FooInterface and BarInterface on constructor
class FooBar implements FooBarInterface {
public foo : FooInterface;
public bar : BarInterface;
public logFooBar(){
console.log("foobar");
}
constructor(FooInterface : FooInterface, BarInterface : BarInterface) {
this.foo = FooInterface;
this.bar = BarInterface;
}
}
Π― ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡ TypeBinding<TServiceType>
Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ Foo
ΠΈ Bar
var fooBinding = new TypeBinding<FooInterface>("FooInterface", Foo);
var barBinding = new TypeBinding<BarInterface>("BarInterface", Bar);
ΠΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ { new(): TServiceType ;}
Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠ»Π°ΡΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠ΅Π³ΠΎ TServiceType
, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠΈΠΏΠ° 'typeof FooBar' Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π°Π·Π½Π°ΡΠ΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠ° 'new () => FooBarInterface'.
var fooBarBinding = new TypeBinding<FooBarInterface>("FooBarInterface", FooBar);
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ?
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ :)
ΠΡΠΌΠ°Ρ, Ρ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π°ΡΡΠΈΠ±ΡΡ ΠΊΠ»Π°ΡΡΠ°:
implementationType : { new(): TServiceType ;},
ΠΊ:
implementationType : { new(...args : any[]): TServiceType ;},
ΠΠ°ΠΏΠΈΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ½ΠΈΡ-ΡΠ΅ΡΡ Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ...
Π£ΠΌΠ½Π°Ρ! Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π»Π°ΠΊΠΎΠΌΡΠΉ ΠΊΡΡΠΎΡΠ΅ΠΊ :)
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΡΡΠΎ, Ρ ΠΈΡΠΊΠ°Π» ΡΠΏΠΎΡΠΎΠ± Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ
Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. { new(...args : any[]): T ;}
ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΠΌΠ½Π΅ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Ρ ΠΌΠΎΠ³Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΡΠ΅Π»Π΅ΠΉ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ°.
function decor(oPar: {}): <TFunc extends { new (...args: any[]): A }>(target: TFunc) => void {
return function <TFunc extends { new (...args: any[]): A }>(target: TFunc): void {
console.log(oPar, target);
}
}
class A { id: string; }
// will error
@decor({})
class B { }
// Works
@decor({})
class C extends A { }
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡΠΌΠ°Ρ, Ρ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² Π°ΡΡΠΈΠ±ΡΡ ΠΊΠ»Π°ΡΡΠ°:
ΠΊ:
ΠΠ°ΠΏΠΈΡΡ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ½ΠΈΡ-ΡΠ΅ΡΡ Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ...