// `./module.ts` export class User { name: string surname: string age: number } es6 import
import * as module from "./module" generates a namespace module and this is bad.
calling
typeof modulebreaksclass genericsfrommodule:type
Useris not assignable to parameter of typetypeof Userthis
modulecannot be extended with thenamespace module {}orinterface module {}.
AT:
- Is there a way to use
namespaceas aclassin the context ofgenerics? - Is there a way to export multiple classes from a module as a class type without manual association?
namespace _0.A - ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ namespace _0.B - ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ namespace _1.extend - ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ see examples here typescriptlang.org/play or read on
// import { User } from "./module" // import * as module from "./module" // Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΡΠΎΠΌΡ: // (Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ `namespace module` Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½) class User { name: string surname: string age: number } namespace module { export class User { name: string surname: string age: number } } namespace _1 { let store = {} type store<T> = { [K in keyof T]: T[K][] } export function set<T>(k: keyof T, val: T[keyof T]) { if (!(store as store<T>)[k]) (store as store<T>)[k] = []; (store as store<T>)[k].push(val) } } namespace _1.A { type mo = typeof module; // -- set<mo>('User', new User) // [ts] Argument of type 'User' is not assignable to parameter of type 'typeof User'. } namespace _1.B { class mo { User: User } // -- set<mo>('User', new User) // ok } namespace _1.extend { class Admin { superpover: true } // -- class mo { User: User } class moExt extends mo { Admin: Admin } // -- set<moExt>('Admin', new Admin) } namespace _0.A { type m = typeof module; type user = m['User'] // bad // type user = typeof User let age: user['age'] // err // [ts] Property 'age' does not exist on type 'typeof User'. } namespace _0.B { class m { User: User } type user = m['User'] // good // type user = User let age: user['age'] // ok // }