Bladeren bron

8.4: modules vs namespaces.

Frederic G. MARAND 5 jaren geleden
bovenliggende
commit
0fe839a60b
7 gewijzigde bestanden met toevoegingen van 124 en 16 verwijderingen
  1. 5 1
      Makefile
  2. 17 13
      app/app.ts
  3. 6 0
      app/app_ns.ts
  4. 1 1
      app/classes.ts
  5. 14 0
      app/membership.ts
  6. 2 1
      app/tsconfig.json
  7. 79 0
      doc/modules.md

+ 5 - 1
Makefile

@@ -1,7 +1,11 @@
-all: js/app.js
+all: js/app.js js/app_ns.js
 
 js/app.js: app/*.ts
 	yarn compile
 
+js/app_ns.js: app/membership.ts app/app_ns.ts
+	npx tsc --outFile js/app_ns.js app/app_ns.ts
+	node js/app_ns.js
+
 clean:
 	yarn clean

+ 17 - 13
app/app.ts

@@ -174,19 +174,23 @@ let myBook: Book = {
 // ref.printItem();
 // console.log(ref.publisher);
 
-let Newspaper = class extends ReferenceItem {
-  printCitation(): void {
-    console.log(`Newspaper: ${this.title}.`);
-  }
-};
+function classDemo() {
+  let Newspaper = class extends ReferenceItem {
+    printCitation(): void {
+      console.log(`Newspaper: ${this.title}.`);
+    }
+  };
 
-let myPaper = new Newspaper('The gazette', 2016);
-myPaper.printCitation();
+  let myPaper = new Newspaper('The gazette', 2016);
+  myPaper.printCitation();
 
-class Novel extends class { title: string } {
-  mainCharacter: string;
+  class Novel extends class { title: string } {
+    mainCharacter: string;
+  }
+  let favoriteNovel = new Novel();
+  favoriteNovel.mainCharacter = 'Hero';
+  favoriteNovel.title = 'Plot';
+  console.log(favoriteNovel);
 }
-let favoriteNovel = new Novel();
-favoriteNovel.mainCharacter = 'Hero';
-favoriteNovel.title = 'Plot';
-console.log(favoriteNovel);
+
+// classDemo();

+ 6 - 0
app/app_ns.ts

@@ -0,0 +1,6 @@
+/// <reference path="membership.ts" />
+
+let memberName = 'Elaine';
+let memberNumber = 789;
+Membership.AddMember(memberName);
+Membership.Cards.IssueCard(memberNumber);

+ 1 - 1
app/classes.ts

@@ -1,4 +1,4 @@
-import {Author, Book, DamageLogger, Librarian} from './interfaces';
+import {Librarian} from './interfaces';
 
 class UniversityLibrarian implements Librarian {
   department: string;

+ 14 - 0
app/membership.ts

@@ -0,0 +1,14 @@
+namespace Membership {
+  export function AddMember(name: string) {
+    console.log(`Adding new member ${name}.`);
+  }
+
+  export namespace Cards {
+    export function IssueCard(memberNumber: number) {
+      console.log(`Issuing new card for member #${memberNumber}.`);
+    }
+  }
+}
+
+Membership.AddMember('Garrett');
+Membership.Cards.IssueCard(1234);

+ 2 - 1
app/tsconfig.json

@@ -11,6 +11,7 @@
     "removeComments": true
   },
   "files": [
-    "app.ts"
+    "app.ts",
+    "app_ns.ts"
   ]
 }

+ 79 - 0
doc/modules.md

@@ -0,0 +1,79 @@
+# Modules selon les versions
+
+* avant TypeScript 1.5 
+  * 2 types de modules: internes et externes
+  * utilisé pour des besoins différents mais avec le même nom
+* TypeScript 1.5
+  * les modules internes deviennent des "namespaces"
+  * les modules externes deviennent des "modules" tout court
+  * support de la syntaxe ES2015 import/export
+
+| Modules                     | Namespaces         |
+|-----------------------------|--------------------|
+| organisent le code          | organisent le code |
+| génération dans divers formats, pour les chargeurs | aucun chargeur nécessaire, utilise --outFile |
+| support natif dans Node au format CommonJS | aucun chargeur nécessaire, utilise --outFile |
+| support browser par des chargeurs séparés: Require.JS / System.JS | ne polluent pas l'espace de noms global |
+| syntaxe ES2015              | optimaux pour de petites applications client |
+| facilitent la réutilisation | |
+| l'avenir                    | |
+
+# Résolution des modules dans TS 2.2.x
+
+Apparemment pas tout à fait correcte: il y a aussi utilisation de 
+`node_modules/@types` pour les imports sans chemin.
+
+## "Classic"
+### "./person" dans /Source/Multimath/player.ts
+
+1. `/Source/Multimath/person.ts`
+1. `/Source/Multimath/person.d.ts` (type definition file)
+
+### "person" dans /Source/Multimath/player.ts
+
+1. `/Source/Multimath/person.ts`
+1. `/Source/Multimath/person.d.ts`
+1. `/Source/person.ts`
+1. `/Source/person.d.ts`
+1. `/person.ts`
+1. `/person.d.ts`
+
+## "Node"
+### "./person" dans /Source/Multimath/player.ts
+
+1. `/Source/Multimath/person.ts`
+1. `/Source/Multimath/person.tsx` (equivalent de JSX en TS)
+1. `/Source/Multimath/person.d.ts` (type definition file)
+1. `/Source/Multimath/person/package.json`: s'il existe une propriété `typings` pointant vers un fichier, l'utiliser
+1. `/Source/Multimath/index.ts`
+1. `/Source/Multimath/index.tsx`
+1. `/Source/Multimath/index.d.ts`
+
+
+### "person" dans /Source/Multimath/player.ts
+
+1. `/Source/Multimath/node_modules/person.ts`
+1. `/Source/Multimath/node_modules/person.tsx`
+1. `/Source/Multimath/node_modules/person.d.ts`
+1. `/Source/Multimath/node_modules/person/package.json#typings` (?)
+1. `/Source/Multimath/node_modules/@types/*ts[x]` (?)
+1. `/Source/Multimath/node_modules/index.ts`
+1. `/Source/Multimath/node_modules/index.tsx`
+1. `/Source/Multimath/node_modules/index.d.ts`
+1. `/Source/node_modules/person.ts`
+1. `/Source/node_modules/person.tsx`
+1. `/Source/node_modules/person.d.ts`
+1. `/Source/node_modules/person/package.json#typings`
+1. `/Source/node_modules/@types/*ts[x]` (?)
+1. `/Source/node_modules/index.ts`
+1. `/Source/node_modules/index.tsx`
+1. `/Source/node_modules/index.d.ts`
+1. `/node_modules/person.ts`
+1. `/node_modules/person.tsx`
+1. `/node_modules/person.d.ts`
+1. `/node_modules/person/package.json#typings`
+1. `/node_modules/@types/*ts[x]` (?)
+1. `/node_modules/index.ts`
+1. `/node_modules/index.tsx`
+1. `/node_modules/index.d.ts`
+1. Then start again with `.js` extension instead of `.ts[x]`.