From 02649793fb124e99670709d5dd6a8e3167d22c4a Mon Sep 17 00:00:00 2001 From: AbubakerB Date: Thu, 18 Feb 2016 21:54:17 +0000 Subject: [PATCH 001/831] Add private and protected constructor topic --- pages/Classes.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/pages/Classes.md b/pages/Classes.md index ddc5e4b6e..6a0378743 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -109,7 +109,7 @@ class Animal { ## Understanding `private` -When a member is marked `private`, it cannot be accessed from outside of its containing class. For example: +When a constructor or member is marked `private`, it cannot be accessed from outside of its containing class. For example: ```ts class Animal { @@ -117,7 +117,13 @@ class Animal { constructor(theName: string) { this.name = theName; } } +class Employee { + private name: string; + private constructor(theName: string) { this.name = theName; } +} + new Animal("Cat").name; // Error: 'name' is private; +new Employee("Bob"); // Error: 'Employee' is private; ``` TypeScript is a structural type system. @@ -189,6 +195,32 @@ console.log(howard.name); // error Notice that while we can't use `name` from outside of `Person`, we can still use it from within an instance method of `Employee` because `Employee` derives from `Person`. +A constructor may also be marked `protected`. This means that the class cannot be accessed outside of its containing class, but can be extended. For example, + +```ts +class Person { + protected name: string; + protected constructor(name: string) { this.name = name; } +} + +// Employee can extend Person +class Employee extends Person { + private department: string; + + constructor(name: string, department: string) { + super(name); + this.department = department; + } + + public getElevatorPitch() { + return `Hello, my name is ${this.name} and I work in ${this.department}.`; + } +} + +let howard = new Employee("Howard", "Sales"); +let john = new Person("John"); // Error: 'Person' is protected and only accessible within it's class. +``` + ## Parameter properties In our last example, we had to declare a private member `name` and a constructor parameter `theName`, and we then immediately set `name` to `theName`. From 0f8feff8aa5794962ad319e61bfa954fea85b592 Mon Sep 17 00:00:00 2001 From: AbubakerB Date: Fri, 19 Feb 2016 21:14:20 +0000 Subject: [PATCH 002/831] Addressed PR --- pages/Classes.md | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/pages/Classes.md b/pages/Classes.md index 6a0378743..41eb7b3f7 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -109,7 +109,7 @@ class Animal { ## Understanding `private` -When a constructor or member is marked `private`, it cannot be accessed from outside of its containing class. For example: +When a member is marked `private`, it cannot be accessed from outside of its containing class. For example: ```ts class Animal { @@ -117,13 +117,7 @@ class Animal { constructor(theName: string) { this.name = theName; } } -class Employee { - private name: string; - private constructor(theName: string) { this.name = theName; } -} - new Animal("Cat").name; // Error: 'name' is private; -new Employee("Bob"); // Error: 'Employee' is private; ``` TypeScript is a structural type system. @@ -195,12 +189,13 @@ console.log(howard.name); // error Notice that while we can't use `name` from outside of `Person`, we can still use it from within an instance method of `Employee` because `Employee` derives from `Person`. -A constructor may also be marked `protected`. This means that the class cannot be accessed outside of its containing class, but can be extended. For example, +A constructor may also be marked `protected`. +This means that the class cannot be instantiated outside of its containing class, but can be extended. For example, ```ts class Person { protected name: string; - protected constructor(name: string) { this.name = name; } + protected constructor(theName: string) { this.name = theName; } } // Employee can extend Person @@ -218,12 +213,12 @@ class Employee extends Person { } let howard = new Employee("Howard", "Sales"); -let john = new Person("John"); // Error: 'Person' is protected and only accessible within it's class. +let john = new Person("John"); // Error: The 'Person' constructor is protected ``` ## Parameter properties -In our last example, we had to declare a private member `name` and a constructor parameter `theName`, and we then immediately set `name` to `theName`. +In our last example, we had to declare a protected member `name` and a constructor parameter `theName` in the `Person` class, and we then immediately set `name` to `theName`. This turns out to be a very common practice. *Parameter properties* let you create and initialize a member in one place. Here's a further revision of the previous `Animal` class using a parameter property: From 05bd50c606841811938296d65e50128f87e94fb4 Mon Sep 17 00:00:00 2001 From: AbubakerB Date: Fri, 19 Feb 2016 21:16:41 +0000 Subject: [PATCH 003/831] Removed whitespace --- pages/Classes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Classes.md b/pages/Classes.md index 41eb7b3f7..ba234e222 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -189,7 +189,7 @@ console.log(howard.name); // error Notice that while we can't use `name` from outside of `Person`, we can still use it from within an instance method of `Employee` because `Employee` derives from `Person`. -A constructor may also be marked `protected`. +A constructor may also be marked `protected`. This means that the class cannot be instantiated outside of its containing class, but can be extended. For example, ```ts @@ -199,7 +199,7 @@ class Person { } // Employee can extend Person -class Employee extends Person { +class Employee extends Person { private department: string; constructor(name: string, department: string) { From e2b5c9be99bbe8528444a813f73abfa5afce0a24 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 22 Mar 2016 10:56:00 -0700 Subject: [PATCH 004/831] Add post 1.8 module resolution updates --- pages/Module Resolution.md | 212 +++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 2eb804f85..e1320df2f 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -38,6 +38,10 @@ Some examples include: A relative import is resolved relative to the importing file and *cannot* resolve to an ambient module declaration. You should use relative imports for your own modules that are guaranteed to maintain their relative location at runtime. +A non-relative import can be resolved relative to `baseUrl`, or through path mapping, which we'll cover below. +They can also resolve to [ambient module declarations](./Modules.md#ambient-modules). +Use non-relative paths when importing any of your external dependnecies. + ## Module Resolution Strategies There are two possible module resolution strategies: [Node](#node) and [Classic](#classic). @@ -167,6 +171,214 @@ So `import { b } from "moduleB"` in source file `/src/moduleA.ts` would result i Don't be intimidated by the number of steps here - TypeScript is still only jumping up directories twice at steps (8) and (15). This is really no more complex than what Node.js itself is doing. +## Additional module resolution flags + +A project source layout sometimes does not match that of the output. +Usually a set of build steps result in generating the final output. +These include compiling `.ts` files into `.js`, and copying dependencies from different source locations to a single output location. +The net result is that modules at runtime may have different names than the source files containing their definitions. +Or module paths in the final output may not match their corresponding source file paths at compile time. + +The TypeScript compiler has a set of additional flags to *inform* the compiler of transformations that are expected to happen to the sources to generate the final output. + +It is important to note that the compiler will *not* perform any of these transformations; +it just uses these pieces of information to guide the process of resolving a module import to its definition file. + +### Base URL + +Using a `baseUrl` is a common practice in applications using AMD module loaders where modules are "deployed" to a single folder at run-time. +The sources of these modules can live in different directories, but a build script will put them all together. + +Setting `baseUrl` informs the compiler where to find modules. +All module imports with non-relative names are assumed to be relative to the `baseUrl`. + +Value of *baseUrl* is determined as either: + +* value of *baseUrl* command line argument (if given path is relative, it is computed based on current directory) +* value of *baseUrl* property in 'tsconfig.json' (if given path is relative, it is computed based on the location of 'tsconfig.json') + +Note that relative module imports are not impacted by setting the baseUrl, as they are always resolved relative to their importing files. + +You can find more documentation on baseUrl in [RequireJS](http://requirejs.org/docs/api.html#config-baseUrl) and [SystemJS](https://github.com/systemjs/systemjs/blob/master/docs/overview.md#baseurl) documentation. + +### Path mapping + +Sometimes modules are not directly located under *baseUrl*. +For instance, an import to a module `"jquery"` would be translated at runtime to `"node_modules\jquery\dist\jquery.slim.min.js"`. +Loaders use a mapping configuration to map module names to files at run-time, see [RequireJs documentation](http://requirejs.org/docs/api.html#config-paths) and [SystemJS documentation](https://github.com/systemjs/systemjs/blob/master/docs/overview.md#map-config). + +The TypeScript compiler supports the declaration of such mappings using `"paths"` property in `tsconfig.json` files. +Here is an example for how to specify the `"paths"` property for `jquery`. + +```json +{ + "compilerOptions": { + "paths": { + "jquery": ["node_modules/jquery/dist/jquery.d.ts"] + } +} +``` + +Using `"paths"` also allow for more sophisticated mappings including multiple fall back locations. +Consider a project configuration where only some modules are available in one location, and the rest are in another. +A build step would put them all together in one place. +The project layout may look like: + +```tree +projectRoot +├── folder1 +│ ├── file1.ts (imports 'folder1/file2' and 'folder2/file3') +│ └── file2.ts +├── generated +│ ├── folder1 +│ └── folder2 +│ └── file3.ts +└── tsconfig.json +``` + +The corresponding `tsconfig.json` would look like: + +```json +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": [ + "*", + "generated/*" + ] + } + } +} +``` + +This tells the compiler for any module import that matches the pattern `"*"` (i.e. all values), to look in two locations: + + 1. `"*"`: meaning the same name unchanged, so map `` => `\` + 2. `"generated\*"` meaning the module name with an appended prefix "generated", so map `` => `\generated\` + +Following this logic, the compiler will attempt to resolve the two imports as such: + +* import 'folder1/file2' + 1. pattern '*' is matched and wildcard captures the whole module name + 2. try first substitution in the list: '*' -> `folder1/file2` + 3. result of substitution is relative name - combine it with *baseUrl* -> `projectRoot/folder1/file2.ts`. + 4. File exists. Done. +* import 'folder2/file2' + 1. pattern '*' is matched and wildcard captures the whole module name + 2. try first substitution in the list: '*' -> `folder2/file3` + 3. result of substitution is relative name - combine it with *baseUrl* -> `projectRoot/folder2/file3.ts`. + 4. File does not exist, move to the second substitution + 5. second substitution 'generated/*' -> `generated/folder2/file3` + 6. result of substitution is relative name - combine it with *baseUrl* -> `projectRoot/generated/folder2/file3.ts`. + 7. File exists. Done. + +### Virtual Directories with `rootDirs` + +Sometimes the project sources from multiple directories at compile time are all combined to generate a single output directory. +This can be viewed as a set of source directories create a "virtual" directory. + +Using 'rootDirs', you can inform the compiler of the *roots* making up this "virtual" directory; +and thus the compiler can resolve relative modules imports within these "virtual" directories *as if* were merged together in one directory. + +For example consider this project structure: + +```tree + src + └── views + └── view1.ts (imports './template1') + └── view2.ts + + generated + └── templates + └── views + └── template1.ts (imports './view2') +``` + +Files in `src/views` are user code for some UI controls. +Files in `generated/templates` are UI template binding code auto-generated by a template generator as part of the build. +A build step will copy the files in `/src/views` and `/generated/templates/views` to the same directory in the output. +At run-time, a view can expect its template to exist next to it, and thus should import it using a relative name as `"./template"`. + +To specify this relationship to the compiler, use`"rootDirs"`. +`"rootDirs"` specify a list of *roots* whose contents are expected to merge at run-time. +So following our example, the `tsconfig.json` file should look like: + +```json +{ + "compilerOptions": { + "rootDirs": [ + "src/views", + "generated/templates" + ] + } +} +``` + +Every time the compiler sees a relative module import in a subfolder of one of the `rootDirs`, it will attempt to look for this import in each of the entries of `rootDirs`. + +## Tracing module resolution + +As discussed earlier, the compiler can visit files outside the current folder when resolving a module. +This can be hard when diagnosing why a module is not resolved, or is resolved to an incorrect definition. +Enabling the compiler module resolution tracing using `--traceModuleResolution` provides insight in what happened during the module resolution process. + +Let's say we have a sample application that uses the `typescript` module. +`app.ts` has an import like `import * as ts from "typescript"`. + +```tree +│ tsconfig.json +├───node_modules +│ └───typescript +│ └───lib +│ typescript.d.ts +└───src + app.ts +``` + +Invoking the compiler with `--traceModuleResolution` + +```shell +tsc --traceModuleResolution +``` + +Results in an output as such: + +```txt +======== Resolving module 'typescript' from 'src/app.ts'. ======== +Module resolution kind is not specified, using 'NodeJs'. +Loading module 'typescript' from 'node_modules' folder. +File 'src/node_modules/typescript.ts' does not exist. +File 'src/node_modules/typescript.tsx' does not exist. +File 'src/node_modules/typescript.d.ts' does not exist. +File 'src/node_modules/typescript/package.json' does not exist. +File 'node_modules/typescript.ts' does not exist. +File 'node_modules/typescript.tsx' does not exist. +File 'node_modules/typescript.d.ts' does not exist. +Found 'package.json' at 'node_modules/typescript/package.json'. +'package.json' has 'typings' field './lib/typescript.d.ts' that references 'node_modules/typescript/lib/typescript.d.ts'. +File 'node_modules/typescript/lib/typescript.d.ts' exist - use it as a module resolution result. +======== Module name 'typescript' was successfully resolved to 'node_modules/typescript/lib/typescript.d.ts'. ======== +``` + +#### Things to look out for + +* Name and location of the import + + > ======== Resolving module **'typescript'** from **'src/app.ts'**. ======== + +* The strategy the compiler is following + + > Module resolution kind is not specified, using **'NodeJs'**. + +* Loading of typings from npm packages + + > 'package.json' has **'typings'** field './lib/typescript.d.ts' that references 'node_modules/typescript/lib/typescript.d.ts'. + +* Final result + + > ======== Module name 'typescript' was **successfully resolved** to 'node_modules/typescript/lib/typescript.d.ts'. ======== + ## Using `--noResolve` Normally the compiler will attempt to resolve all module imports before it starts the compilation process. From 4761af52dafd81607b731ac0c25d86baf1bf2dbb Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Wed, 13 Apr 2016 16:27:04 -0700 Subject: [PATCH 005/831] docs(Module Resolution): update --traceModuleResolution to --traceResolution --- pages/Module Resolution.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index e1320df2f..9ceeb6465 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -321,7 +321,7 @@ Every time the compiler sees a relative module import in a subfolder of one of t As discussed earlier, the compiler can visit files outside the current folder when resolving a module. This can be hard when diagnosing why a module is not resolved, or is resolved to an incorrect definition. -Enabling the compiler module resolution tracing using `--traceModuleResolution` provides insight in what happened during the module resolution process. +Enabling the compiler module resolution tracing using `--traceResolution` provides insight in what happened during the module resolution process. Let's say we have a sample application that uses the `typescript` module. `app.ts` has an import like `import * as ts from "typescript"`. @@ -336,10 +336,10 @@ Let's say we have a sample application that uses the `typescript` module. app.ts ``` -Invoking the compiler with `--traceModuleResolution` +Invoking the compiler with `--traceResolution` ```shell -tsc --traceModuleResolution +tsc --traceResolution ``` Results in an output as such: From fe4486792fe598de37f6a27cda07b405aee1bf7b Mon Sep 17 00:00:00 2001 From: Veniamin Krol Date: Mon, 25 Apr 2016 16:22:14 +0300 Subject: [PATCH 006/831] Fix small typo --- pages/Module Resolution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 9ceeb6465..f33f513fa 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -264,7 +264,7 @@ Following this logic, the compiler will attempt to resolve the two imports as su 2. try first substitution in the list: '*' -> `folder1/file2` 3. result of substitution is relative name - combine it with *baseUrl* -> `projectRoot/folder1/file2.ts`. 4. File exists. Done. -* import 'folder2/file2' +* import 'folder2/file3' 1. pattern '*' is matched and wildcard captures the whole module name 2. try first substitution in the list: '*' -> `folder2/file3` 3. result of substitution is relative name - combine it with *baseUrl* -> `projectRoot/folder2/file3.ts`. From a1fc0d389cf8fc2590d5d0daca0ebd35c0b18bcb Mon Sep 17 00:00:00 2001 From: Travis Hill Date: Tue, 3 May 2016 15:13:55 -0400 Subject: [PATCH 007/831] Fixed minor grammar mistakes --- pages/Classes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Classes.md b/pages/Classes.md index 492608494..1591c0251 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -270,7 +270,7 @@ Note: Accessors require you to set the compiler to output ECMAScript 5 or higher # Static Properties -Up to this point, we've only talked about the *instance* members of the class, those that show up on the object when its instantiated. +Up to this point, we've only talked about the *instance* members of the class, those that show up on the object when it's instantiated. We can also create *static* members of a class, those that are visible on the class itself rather than on the instances. In this example, we use `static` on the origin, as it's a general value for all grids. Each instance accesses this value through prepending the name of the class. @@ -437,7 +437,7 @@ Next, we then use the class directly. Here we create a new variable called `greeterMaker`. This variable will hold the class itself, or said another way its constructor function. Here we use `typeof Greeter`, that is "give me the type of the `Greeter` class itself" rather than the instance type. -Or, more precisely, "give me the type of the symbol called `Greeter`", which is the type of the constructor function. +Or, more precisely, "give me the type of the symbol called `Greeter`," which is the type of the constructor function. This type will contain all of the static members of Greeter along with the constructor that creates instances of the `Greeter` class. We show this by using `new` on `greeterMaker`, creating new instances of `Greeter` and invoking them as before. From d16def9acf00ae3effa2abb11927be13578d7112 Mon Sep 17 00:00:00 2001 From: Travis Hill Date: Tue, 3 May 2016 15:47:05 -0400 Subject: [PATCH 008/831] Fixed minor grammar mistakes on Functions page --- pages/Functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Functions.md b/pages/Functions.md index 8ee74b85c..c6e17059c 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -253,7 +253,7 @@ This is because the `this` being used in the function created by `createCardPick This happens as a result of calling `cardPicker()`. Here, there is no dynamic binding for `this` other than Window. (note: under strict mode, this will be undefined rather than window). We can fix this by making sure the function is bound to the correct `this` before we return the function to be used later. -This way, regardless of how its later used, it will still be able to see the original `deck` object. +This way, regardless of how it's later used, it will still be able to see the original `deck` object. To fix this, we switch the function expression to use the arrow syntax (`() => {}`) rather than the JavaScript function expression. This will automatically capture the `this` available when the function is created rather than when it is invoked: From fdd9621c877bb2ab010f7499696609a5723752cd Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 6 May 2016 15:40:34 -0700 Subject: [PATCH 009/831] Update documentation for `--p` Update documentation to point the option of using a file name as referenced in https://github.com/Microsoft/TypeScript/issues/8500 --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 8264490ce..9e096ca45 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -39,7 +39,7 @@ Option | Type | Default `--outFile` | `string` | `null` | Concatenate and emit output to single file. The order of concatenation is determined by the list of files passed to the compiler on the command line along with triple-slash references and imports. See output file order documentation for more details. `--preserveConstEnums` | `boolean` | `false` | Do not erase const enum declarations in generated code. See [const enums documentation](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#94-constant-enum-declarations) for more details. `--pretty`[1] | `boolean` | `false` | Stylize errors and messages using color and context. -`--project`
`-p` | `string` | `null` | Compile the project in the given directory. The directory needs to contain a `tsconfig.json` file to direct compilation. See [tsconfig.json](./tsconfig.json.md) documentation for more details. +`--project`
`-p` | `string` | `null` | Compile a project given a valid configuration file.
The argument can be an file path to a valid JSON configuration file, or a directory path to a directory containing a `tsconfig.json` file.
See [tsconfig.json](./tsconfig.json.md) documentation for more details. `--reactNamespace` | `string` | `"React"` | Specifies the object invoked for `createElement` and `__spread` when targeting 'react' JSX emit. `--removeComments` | `boolean` | `false` | Remove all comments except copy-right header comments beginning with `/*!` `--rootDir` | `string` | *(common root directory is computed from the list of input files)* | Specifies the root directory of input files. Only use to control the output directory structure with `--outDir`. From dfb4927fd53f4fd471b522fbca010837c21e1c5e Mon Sep 17 00:00:00 2001 From: wanderer06 Date: Wed, 11 May 2016 10:24:06 +0100 Subject: [PATCH 010/831] Fix inconsistent quoting style --- pages/Advanced Types.md | 4 ++-- pages/Basic Types.md | 8 ++++---- pages/Classes.md | 12 ++++++------ pages/Decorators.md | 4 ++-- pages/Functions.md | 6 +++--- pages/Generics.md | 4 ++-- pages/Integrating with Build Tools.md | 16 ++++++++-------- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 932c3934e..b7e470591 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -223,7 +223,7 @@ function getRandomPadder() { new StringPadder(" "); } -// Type is SpaceRepeatingPadder | StringPadder +// Type is 'SpaceRepeatingPadder | StringPadder' let padder: Padder = getRandomPadder(); if (padder instanceof SpaceRepeatingPadder) { @@ -289,7 +289,7 @@ type Name = string; type NameResolver = () => string; type NameOrResolver = Name | NameResolver; function getName(n: NameOrResolver): Name { - if (typeof n === 'string') { + if (typeof n === "string") { return n; } else { diff --git a/pages/Basic Types.md b/pages/Basic Types.md index 45e2b2356..ffbee4292 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -78,9 +78,9 @@ For example, you may want to represent a value as a pair of a `string` and a `nu // Declare a tuple type let x: [string, number]; // Initialize it -x = ['hello', 10]; // OK +x = ["hello", 10]; // OK // Initialize it incorrectly -x = [10, 'hello']; // Error +x = [10, "hello"]; // Error ``` When accessing an element with a known index, the correct type is retrieved: @@ -93,11 +93,11 @@ console.log(x[1].substr(1)); // Error, 'number' does not have 'substr' When accessing an element outside the set of known indices, a union type is used instead: ```ts -x[3] = 'world'; // OK, string can be assigned to (string | number) +x[3] = "world"; // OK, string can be assigned to 'string | number' console.log(x[5].toString()); // OK, 'string' and 'number' both have toString -x[6] = true; // Error, boolean isn't (string | number) +x[6] = true; // Error, boolean isn't 'string | number' ``` Union types are an advanced topic that we'll cover in a later chapter. diff --git a/pages/Classes.md b/pages/Classes.md index 1591c0251..3e03784ee 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -149,7 +149,7 @@ let rhino = new Rhino(); let employee = new Employee("Bob"); animal = rhino; -animal = employee; // Error: Animal and Employee are not compatible +animal = employee; // Error: 'Animal' and 'Employee' are not compatible ``` In this example, we have an `Animal` and a `Rhino`, with `Rhino` being a subclass of `Animal`. @@ -305,7 +305,7 @@ The `abstract` keyword is used to define abstract classes as well as abstract me abstract class Animal { abstract makeSound(): void; move(): void { - console.log('roaming the earth...'); + console.log("roaming the earth..."); } } ``` @@ -322,7 +322,7 @@ abstract class Department { } printName(): void { - console.log('Department name: ' + this.name); + console.log("Department name: " + this.name); } abstract printMeeting(): void; // must be implemented in derived classes @@ -331,15 +331,15 @@ abstract class Department { class AccountingDepartment extends Department { constructor() { - super('Accounting and Auditing'); // constructors in derived classes must call super() + super("Accounting and Auditing"); // constructors in derived classes must call super() } printMeeting(): void { - console.log('The Accounting Department meets each Monday at 10am.'); + console.log("The Accounting Department meets each Monday at 10am."); } generateReports(): void { - console.log('Generating accounting reports...'); + console.log("Generating accounting reports..."); } } diff --git a/pages/Decorators.md b/pages/Decorators.md index b58f92f04..279ac520a 100644 --- a/pages/Decorators.md +++ b/pages/Decorators.md @@ -34,7 +34,7 @@ For example, given the decorator `@sealed` we might write the `sealed` function ```ts function sealed(target) { - // do something with "target" ... + // do something with 'target' ... } ``` @@ -50,7 +50,7 @@ We can write a decorator factory in the following fashion: ```ts function color(value: string) { // this is the decorator factory return function (target) { // this is the decorator - // do something with "target" and "value"... + // do something with 'target' and 'value'... } } ``` diff --git a/pages/Functions.md b/pages/Functions.md index c6e17059c..7570d2c91 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -79,7 +79,7 @@ As mentioned before, this is a required part of the function type, so if the fun Of note, only the parameters and the return type make up the function type. Captured variables are not reflected in the type. -In effect, captured variables are part of the 'hidden state' of any function and do not make up its API. +In effect, captured variables are part of the "hidden state" of any function and do not make up its API. ## Inferring the types @@ -89,7 +89,7 @@ In playing with the example, you may notice that the TypeScript compiler can fig // myAdd has the full function type let myAdd = function(x: number, y: number): number { return x + y; }; -// The parameters `x` and `y` have the type number +// The parameters 'x' and 'y' have the type number let myAdd: (baseValue:number, increment:number) => number = function(x, y) { return x + y; }; ``` @@ -263,7 +263,7 @@ let deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { - // Notice: the line below is now a lambda, allowing us to capture `this` earlier + // Notice: the line below is now a lambda, allowing us to capture 'this' earlier return () => { let pickedCard = Math.floor(Math.random() * 52); let pickedSuit = Math.floor(pickedCard / 13); diff --git a/pages/Generics.md b/pages/Generics.md index 3400417dd..a50679a09 100644 --- a/pages/Generics.md +++ b/pages/Generics.md @@ -3,14 +3,14 @@ A major part of software engineering is building components that not only have well-defined and consistent APIs, but are also reusable. Components that are capable of working on the data of today as well as the data of tomorrow will give you the most flexible capabilities for building up large software systems. -In languages like C# and Java, one of the main tools in the toolbox for creating reusable components is 'generics', that is, being able to create a component that can work over a variety of types rather than a single one. +In languages like C# and Java, one of the main tools in the toolbox for creating reusable components is *generics*, that is, being able to create a component that can work over a variety of types rather than a single one. This allows users to consume these components and use their own types. # Hello World of Generics To start off, let's do the "hello world" of generics: the identity function. The identity function is a function that will return back whatever is passed in. -You can think of this in a similar way to the 'echo' command. +You can think of this in a similar way to the `echo` command. Without generics, we would either have to give the identity function a specific type: diff --git a/pages/Integrating with Build Tools.md b/pages/Integrating with Build Tools.md index c6d669cee..e53d5ee7d 100644 --- a/pages/Integrating with Build Tools.md +++ b/pages/Integrating with Build Tools.md @@ -19,8 +19,8 @@ var browserify = require("browserify"); var tsify = require("tsify"); browserify() - .add('main.ts') - .plugin('tsify', { noImplicitAny: true }) + .add("main.ts") + .plugin("tsify", { noImplicitAny: true }) .bundle() .pipe(process.stdout); ``` @@ -44,15 +44,15 @@ duo --use duo-typescript entry.ts ### Using API ```js -var Duo = require('duo'); -var fs = require('fs') -var path = require('path') -var typescript = require('duo-typescript'); +var Duo = require("duo"); +var fs = require("fs") +var path = require("path") +var typescript = require("duo-typescript"); var out = path.join(__dirname, "output.js") Duo(__dirname) - .entry('entry.ts') + .entry("entry.ts") .use(typescript()) .run(function (err, results) { if (err) throw err; @@ -109,7 +109,7 @@ gulp.task("default", function () { noImplicitAny: true, out: "output.js" })); - return tsResult.js.pipe(gulp.dest('built/local')); + return tsResult.js.pipe(gulp.dest("built/local")); }); ``` From 717d5d76b100ebf2853cf0749ae8d58078c8d727 Mon Sep 17 00:00:00 2001 From: wanderer06 Date: Wed, 11 May 2016 11:07:44 +0100 Subject: [PATCH 011/831] Fix inconsistent quoting style --- pages/JSX.md | 12 ++++++------ pages/Module Resolution.md | 2 +- pages/Modules.md | 8 ++++---- pages/Namespaces.md | 2 +- pages/Triple-Slash Directives.md | 2 +- pages/Type Compatibility.md | 18 +++++++++--------- pages/Variable Declarations.md | 2 +- pages/Writing Declaration Files.md | 12 ++++++------ 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/pages/JSX.md b/pages/JSX.md index 07166546e..1838736b9 100644 --- a/pages/JSX.md +++ b/pages/JSX.md @@ -178,7 +178,7 @@ declare namespace JSX { } } -// element attributes type for `foo` is `{bar?: boolean}` +// element attributes type for 'foo' is '{bar?: boolean}' ; ``` @@ -202,7 +202,7 @@ class MyComponent { } } -// element attributes type for `MyComponent` is `{foo?: string}` +// element attributes type for 'MyComponent' is '{foo?: string}' ``` @@ -221,7 +221,7 @@ declare namespace JSX { ; // error, requiredProp is missing ; // error, requiredProp should be a string ; // error, unknownProp does not exist -; // ok, because `some-unknown-prop` is not a valid identifier +; // ok, because 'some-unknown-prop' is not a valid identifier ``` > Note: If an attribute name is not a valid JS identifier (like a `data-*` attribute), it is not considered to be an error if it is not found in the element attributes type. @@ -229,7 +229,7 @@ declare namespace JSX { The spread operator also works: ```JSX -var props = { requiredProp: 'bar' }; +var props = { requiredProp: "bar" }; ; // ok var badProps = {}; @@ -249,7 +249,7 @@ JSX allows you to embed expressions between tags by surrounding the expressions ```JSX var a =
- {['foo', 'bar'].map(i => {i / 2})} + {["foo", "bar"].map(i => {i / 2})}
``` @@ -258,7 +258,7 @@ The output, when using the `preserve` option, looks like: ```JSX var a =
- {['foo', 'bar'].map(function (i) { return {i / 2}; })} + {["foo", "bar"].map(function (i) { return {i / 2}; })}
``` diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 2eb804f85..d537ff1c4 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -180,7 +180,7 @@ For instance: #### app.ts ```ts -import * as A from "moduleA" // OK, moduleA passed on the command-line +import * as A from "moduleA" // OK, 'moduleA' passed on the command-line import * as B from "moduleB" // Error TS2307: Cannot find module 'moduleB'. ``` diff --git a/pages/Modules.md b/pages/Modules.md index 753d9d8d6..9689f8b4c 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -81,9 +81,9 @@ Optionally, a module can wrap one or more modules and combine all their exports ##### AllValidators.ts ```ts -export * from "./StringValidator"; // exports interface StringValidator -export * from "./LettersOnlyValidator"; // exports class LettersOnlyValidator -export * from "./ZipCodeValidator"; // exports class ZipCodeValidator +export * from "./StringValidator"; // exports interface 'StringValidator' +export * from "./LettersOnlyValidator"; // exports class 'LettersOnlyValidator' +export * from "./ZipCodeValidator"; // exports class 'ZipCodeValidator' ``` # Import @@ -532,7 +532,7 @@ export default class SomeType { #### MyFunc.ts ```ts -export default function getThing() { return 'thing'; } +export default function getThing() { return "thing"; } ``` #### Consumer.ts diff --git a/pages/Namespaces.md b/pages/Namespaces.md index d81dc2240..9a8c532f1 100644 --- a/pages/Namespaces.md +++ b/pages/Namespaces.md @@ -218,7 +218,7 @@ namespace Shapes { } import polygons = Shapes.Polygons; -let sq = new polygons.Square(); // Same as "new Shapes.Polygons.Square()" +let sq = new polygons.Square(); // Same as 'new Shapes.Polygons.Square()' ``` Notice that we don't use the `require` keyword; instead we assign directly from the qualified name of the symbol we're importing. diff --git a/pages/Triple-Slash Directives.md b/pages/Triple-Slash Directives.md index 914a60ffb..dac5481c0 100644 --- a/pages/Triple-Slash Directives.md +++ b/pages/Triple-Slash Directives.md @@ -57,7 +57,7 @@ The `amd-module` directive allows passing an optional module name to the compile ##### amdModule.ts ```ts -/// +/// export class C { } ``` diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index e85c028bb..92f88bf41 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -39,7 +39,7 @@ interface Named { let x: Named; // y's inferred type is { name: string; location: string; } -let y = { name: 'Alice', location: 'Seattle' }; +let y = { name: "Alice", location: "Seattle" }; x = y; ``` @@ -50,7 +50,7 @@ The same rule for assignment is used when checking function call arguments: ```ts function greet(n: Named) { - alert('Hello, ' + n.name); + alert("Hello, " + n.name); } greet(y); // OK ``` @@ -98,8 +98,8 @@ items.forEach(item => console.log(item)); Now let's look at how return types are treated, using two functions that differ only by their return type: ```ts -let x = () => ({name: 'Alice'}); -let y = () => ({name: 'Alice', location: 'Seattle'}); +let x = () => ({name: "Alice"}); +let y = () => ({name: "Alice", location: "Seattle"}); x = y; // OK y = x; // Error because x() lacks a location property @@ -125,11 +125,11 @@ function listenEvent(eventType: EventType, handler: (n: Event) => void) { } // Unsound, but useful and common -listenEvent(EventType.Mouse, (e: MouseEvent) => console.log(e.x + ',' + e.y)); +listenEvent(EventType.Mouse, (e: MouseEvent) => console.log(e.x + "," + e.y)); // Undesirable alternatives in presence of soundness -listenEvent(EventType.Mouse, (e: Event) => console.log((e).x + ',' + (e).y)); -listenEvent(EventType.Mouse, <(e: Event) => void>((e: MouseEvent) => console.log(e.x + ',' + e.y))); +listenEvent(EventType.Mouse, (e: Event) => console.log((e).x + "," + (e).y)); +listenEvent(EventType.Mouse, <(e: Event) => void>((e: MouseEvent) => console.log(e.x + "," + e.y))); // Still disallowed (clear error). Type safety enforced for wholly incompatible types listenEvent(EventType.Mouse, (e: number) => console.log(e)); @@ -152,10 +152,10 @@ function invokeLater(args: any[], callback: (...args: any[]) => void) { } // Unsound - invokeLater "might" provide any number of arguments -invokeLater([1, 2], (x, y) => console.log(x + ', ' + y)); +invokeLater([1, 2], (x, y) => console.log(x + ", " + y)); // Confusing (x and y are actually required) and undiscoverable -invokeLater([1, 2], (x?, y?) => console.log(x + ', ' + y)); +invokeLater([1, 2], (x?, y?) => console.log(x + ", " + y)); ``` ## Functions with overloads diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index bf3bd2033..14f7be4c5 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -81,7 +81,7 @@ function f(shouldInitialize: boolean) { return x; } -f(true); // returns '10' +f(true); // returns 10 f(false); // returns 'undefined' ``` diff --git a/pages/Writing Declaration Files.md b/pages/Writing Declaration Files.md index 50e4cd73d..d3a75da7a 100644 --- a/pages/Writing Declaration Files.md +++ b/pages/Writing Declaration Files.md @@ -178,7 +178,7 @@ declare var widget: WidgetFactory; ```ts // Either -import x = require('zoo'); +import x = require("zoo"); x.open(); // or zoo.open(); @@ -202,16 +202,16 @@ declare module "zoo" { ```ts // Super-chainable library for eagles -import Eagle = require('./eagle'); +import Eagle = require("./eagle"); // Call directly -Eagle('bald').fly(); +Eagle("bald").fly(); // Invoke with new -var eddie = new Eagle('Mille'); +var eddie = new Eagle("Mille"); // Set properties -eddie.kind = 'golden'; +eddie.kind = "golden"; ``` #### Typing @@ -255,7 +255,7 @@ declare module "say-hello" { #### Usage ```ts -addLater(3, 4, x => console.log('x = ' + x)); +addLater(3, 4, x => console.log("x = " + x)); ``` #### Typing From 5d440adc3879c6b9140cc5366f122908e6149097 Mon Sep 17 00:00:00 2001 From: Xcat Liu Date: Thu, 12 May 2016 18:20:36 +0800 Subject: [PATCH 012/831] Fix errors in Advanced Types throw new Error(`Expected string or number, got '${value}'.`); probably should be throw new Error(`Expected string or number, got '${padding}'.`); --- pages/Advanced Types.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 932c3934e..e92534222 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -16,7 +16,7 @@ function padLeft(value: string, padding: any) { if (typeof padding === "string") { return padding + value; } - throw new Error(`Expected string or number, got '${value}'.`); + throw new Error(`Expected string or number, got '${padding}'.`); } padLeft("Hello world", 4); // returns " Hello world" @@ -168,7 +168,7 @@ function padLeft(value: string, padding: string | number) { if (isString(padding)) { return padding + value; } - throw new Error(`Expected string or number, got '${value}'.`); + throw new Error(`Expected string or number, got '${padding}'.`); } ``` @@ -184,7 +184,7 @@ function padLeft(value: string, padding: string | number) { if (typeof padding === "string") { return padding + value; } - throw new Error(`Expected string or number, got '${value}'.`); + throw new Error(`Expected string or number, got '${padding}'.`); } ``` From 6f96f2bad1c1a1007bd9175b52537498409f2aa3 Mon Sep 17 00:00:00 2001 From: Ivan Zlatev Date: Mon, 16 May 2016 13:41:30 +0100 Subject: [PATCH 013/831] Fixed a folder name typo. Closes #279 --- pages/tutorials/React & Webpack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index f7b915e1b..5486a59c0 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -45,7 +45,7 @@ npm init You'll be given a series of prompts. You can use the defaults except for your entry point. -For your entry point, use `./lib/bundle.js`. +For your entry point, use `./dist/bundle.js`. You can always go back and change these in the `package.json` file that's been generated for you. # Install our dependencies From 7b2d654166574836729819120563208c503adb16 Mon Sep 17 00:00:00 2001 From: Jason Jarrett Date: Mon, 16 May 2016 19:00:28 -0700 Subject: [PATCH 014/831] Some edits as I walked through the tutorial --- pages/tutorials/React & Webpack.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 5486a59c0..f238324b9 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -83,11 +83,12 @@ If you want a local copy, just run `npm install typescript`. Finally, we'll use Typings to grab the declaration files for React and ReactDOM: ```shell -typings install --ambient --save react -typings install --ambient --save react-dom +typings install --global --save "dt~react" +typings install --global --save "dt~react" ``` -The `--ambient` flag will tell Typings to grab any declaration files from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped), a repository of community-authored `.d.ts` files. +The `dt~` tells typings to use the [dt | DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) soruce, a repository of community-authored `.d.ts` files. + This command will create a file called `typings.json` and a folder called `typings` in the current directory. # Add a TypeScript configuration file @@ -108,14 +109,14 @@ Simply create a new file in your project root named `tsconfig.json` and fill it "jsx": "react" }, "files": [ - "./typings/main.d.ts", + "./typings/index.d.ts", "./src/components/Hello.tsx", "./src/index.tsx" ] } ``` -We're including `typings/main.d.ts`, which Typings created for us. +We're including `typings/index.d.ts`, which Typings created for us. That file automatically includes all of your installed dependencies. You might be wondering about a separate file named `browser.d.ts` in the `typings` folder, especially since we're going to run this in a browser. From 4362680e04fd7bf22269a2487f2593c12d177d23 Mon Sep 17 00:00:00 2001 From: Jason Jarrett Date: Mon, 16 May 2016 19:41:35 -0700 Subject: [PATCH 015/831] Update React & Webpack.md --- pages/tutorials/React & Webpack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index f238324b9..6afefbe78 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -84,7 +84,7 @@ Finally, we'll use Typings to grab the declaration files for React and ReactDOM: ```shell typings install --global --save "dt~react" -typings install --global --save "dt~react" +typings install --global --save "dt~react-dom" ``` The `dt~` tells typings to use the [dt | DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) soruce, a repository of community-authored `.d.ts` files. From 27dbf0e43b0b5e105bf6423653a12470eb39fef6 Mon Sep 17 00:00:00 2001 From: Jason Jarrett Date: Tue, 17 May 2016 07:41:49 -0700 Subject: [PATCH 016/831] Update React & Webpack.md --- pages/tutorials/React & Webpack.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 6afefbe78..0cabc9dec 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -87,7 +87,8 @@ typings install --global --save "dt~react" typings install --global --save "dt~react-dom" ``` -The `dt~` tells typings to use the [dt | DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) soruce, a repository of community-authored `.d.ts` files. +The `--global` flag, along with the `dt~` prefix tells Typings to grab any declaration files from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped), a repository of community-authored `.d.ts` files. +Add a line note This command will create a file called `typings.json` and a folder called `typings` in the current directory. From b08f8c4a2cac3b0aa8297830b932c4ff4578bb3e Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 17 May 2016 13:23:17 -0700 Subject: [PATCH 017/831] Remove a line note. --- pages/tutorials/React & Webpack.md | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 0cabc9dec..553a51cef 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -88,7 +88,6 @@ typings install --global --save "dt~react-dom" ``` The `--global` flag, along with the `dt~` prefix tells Typings to grab any declaration files from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped), a repository of community-authored `.d.ts` files. -Add a line note This command will create a file called `typings.json` and a folder called `typings` in the current directory. From 5d9768f94d4290272292ee93e581ff1fa27acb87 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 17 May 2016 13:40:10 -0700 Subject: [PATCH 018/831] Updated tutorials to use Typings 1.0. --- pages/tutorials/ASP.NET 4.md | 8 ++++---- pages/tutorials/ASP.NET Core.md | 4 ++-- pages/tutorials/Knockout.md | 12 ++++-------- pages/tutorials/React & Webpack.md | 4 ---- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/pages/tutorials/ASP.NET 4.md b/pages/tutorials/ASP.NET 4.md index 5388a75fd..ea3624772 100644 --- a/pages/tutorials/ASP.NET 4.md +++ b/pages/tutorials/ASP.NET 4.md @@ -151,9 +151,9 @@ Next we'll include Angular and write a simple Angular app. Now that Angular 2 and its dependencies are installed, we need to enable TypeScript's experimental support for decorators and include the es6-shim typings. In the future decorators and ES6 will be the default and these settings will not be needed. -Add `"experimentalDecorators": true, "emitDecoratorMetadata": true` to the `"compilerOptions"` section, and add `"./typings/main.d.ts"` to the `"files"` section. +Add `"experimentalDecorators": true, "emitDecoratorMetadata": true` to the `"compilerOptions"` section, and add `"./typings/index.d.ts"` to the `"files"` section. Finally, we need to add a new entry in `"files"` for another file, `"./src/model.ts"`, that we will create. -The tsconfig should now look like this: +Our `tsconfig.json` should now look like this: ```json { @@ -170,7 +170,7 @@ The tsconfig should now look like this: "./src/app.ts", "./src/model.ts", "./src/main.ts", - "./typings/main.d.ts" + "./typings/index.d.ts" ] } ``` @@ -194,7 +194,7 @@ After the TypeScript configuration PropertyGroup, add a new ItemGroup and Target ``` Now right-click on the project and reload it. -You should now see node_modules in the Solution Explorer. +You should now see `node_modules` in the Solution Explorer. ## Write a simple Angular app in TypeScript diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index 336f6a9f3..931889e83 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -233,14 +233,14 @@ Open a command prompt, then change directory to the app source: ```shell cd C:\Users\\Documents\Visual Studio 2015\Projects\\src\ npm install -g typings -typings install es6-shim --ambient +typings install --global dt~es6-shim ``` ## Update tsconfig.json Now that Angular 2 and its dependencies are installed, we need to enable TypeScript's experimental support for decorators and include the es6-shim typings. In the future decorators and ES6 will be the default and these settings will not be needed. -Add `"experimentalDecorators": true, "emitDecoratorMetadata": true` to the `"compilerOptions"` section, and add `"../typings/main.d.ts"` to the `"files"` section. +Add `"experimentalDecorators": true, "emitDecoratorMetadata": true` to the `"compilerOptions"` section, and add `"../typings/index.d.ts"` to the `"files"` section. Finally, we need to add a new entry in `"files"` for another file, `"./model.ts"`, that we will create. The tsconfig should now look like this: diff --git a/pages/tutorials/Knockout.md b/pages/tutorials/Knockout.md index cd69b8871..5e498fcfd 100644 --- a/pages/tutorials/Knockout.md +++ b/pages/tutorials/Knockout.md @@ -42,10 +42,10 @@ You obviously know about TypeScript, but you might not know about Typings. We'll now use Typings to grab declaration files for Knockout: ```shell -typings install --ambient --save knockout +typings install --global --save dt~knockout ``` -The `--ambient` flag will tell Typings to grab any declaration files from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped), a repository of community-authored `.d.ts` files. +The `--global` flag will tell Typings to grab any declaration files from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped), a repository of community-authored `.d.ts` files. This command will create a file called `typings.json` and a folder called `typings` in the current directory. # Grab our runtime dependencies @@ -87,20 +87,16 @@ Simply create a new file in your project root named `tsconfig.json` and fill it "target": "es5" }, "files": [ - "./typings/main.d.ts", + "./typings/index.d.ts", "./src/require-config.ts", "./src/hello.ts" ] } ``` -We're including `typings/main.d.ts`, which Typings created for us. +We're including `typings/index.d.ts`, which Typings created for us. That file automatically includes all of your installed dependencies. -You might be wondering about a separate file named `browser.d.ts` in the `typings` folder, especially since we're going to run this in a browser. -The short story is that some packages are tailored differently by tools that target browsers. -In general, these situations are niche scenarios and we won't run into those, so we can ignore `browser.d.ts`. - You can learn more about `tsconfig.json` files [here](../tsconfig.json.md). # Write some code diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 553a51cef..1787c16c1 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -119,10 +119,6 @@ Simply create a new file in your project root named `tsconfig.json` and fill it We're including `typings/index.d.ts`, which Typings created for us. That file automatically includes all of your installed dependencies. -You might be wondering about a separate file named `browser.d.ts` in the `typings` folder, especially since we're going to run this in a browser. -The short story is that some packages are tailored differently by tools that target browsers. -In general, these situations are niche scenarios and we won't run into those, so we can ignore `browser.d.ts`. - You can learn more about `tsconfig.json` files [here](../tsconfig.json.md). # Write some code From 6d212a342594e83a8eb33231cb92afd0f4239e6f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 17 May 2016 13:57:15 -0700 Subject: [PATCH 019/831] Removed quotes. --- pages/tutorials/React & Webpack.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 1787c16c1..f43690354 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -83,8 +83,8 @@ If you want a local copy, just run `npm install typescript`. Finally, we'll use Typings to grab the declaration files for React and ReactDOM: ```shell -typings install --global --save "dt~react" -typings install --global --save "dt~react-dom" +typings install --global --save dt~react +typings install --global --save dt~react-dom ``` The `--global` flag, along with the `dt~` prefix tells Typings to grab any declaration files from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped), a repository of community-authored `.d.ts` files. From e9574d5ec10aa2d387fc562174f08cadd3339786 Mon Sep 17 00:00:00 2001 From: wanderer06 Date: Wed, 18 May 2016 16:17:44 +0100 Subject: [PATCH 020/831] Fix quotes for return types and numbers --- pages/Basic Types.md | 6 +++--- pages/Variable Declarations.md | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index ffbee4292..74ccb5c7c 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -93,11 +93,11 @@ console.log(x[1].substr(1)); // Error, 'number' does not have 'substr' When accessing an element outside the set of known indices, a union type is used instead: ```ts -x[3] = "world"; // OK, string can be assigned to 'string | number' +x[3] = "world"; // OK, 'string' can be assigned to 'string | number' -console.log(x[5].toString()); // OK, 'string' and 'number' both have toString +console.log(x[5].toString()); // OK, 'string' and 'number' both have 'toString' -x[6] = true; // Error, boolean isn't 'string | number' +x[6] = true; // Error, 'boolean' isn't 'string | number' ``` Union types are an advanced topic that we'll cover in a later chapter. diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index 14f7be4c5..aa3f63895 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -42,7 +42,7 @@ function f() { } var g = f(); -g(); // returns 11; +g(); // returns '11' ``` In this above example, `g` captured the variable `a` declared in `f`. @@ -64,7 +64,7 @@ function f() { } } -f(); // returns 2 +f(); // returns '2' ``` ## Scoping rules @@ -81,7 +81,7 @@ function f(shouldInitialize: boolean) { return x; } -f(true); // returns 10 +f(true); // returns '10' f(false); // returns 'undefined' ``` @@ -304,8 +304,8 @@ function f(condition, x) { return x; } -f(false, 0); // returns 0 -f(true, 0); // returns 100 +f(false, 0); // returns '0' +f(true, 0); // returns '100' ``` The act of introducing a new name in a more nested scope is called *shadowing*. From f36b33012d7d03829cb7185964ceabe3a29daf8f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 23 May 2016 11:49:12 -0700 Subject: [PATCH 021/831] name -> color --- pages/Basic Types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index 74ccb5c7c..0d40b5f2e 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -32,7 +32,7 @@ Just like JavaScript, TypeScript also uses double quotes (`"`) or single quotes ```ts let color: string = "blue"; -name = 'red'; +color = 'red'; ``` You can also use *template strings*, which can span multiple lines and have embedded expressions. From be76cd21e52e13c4f5120836c853216db20f5000 Mon Sep 17 00:00:00 2001 From: Omer Wazir Date: Wed, 1 Jun 2016 11:39:41 -0700 Subject: [PATCH 022/831] Add babelify preset and extensions options --- pages/tutorials/Gulp.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pages/tutorials/Gulp.md b/pages/tutorials/Gulp.md index 7e02415c1..6503fcffc 100644 --- a/pages/tutorials/Gulp.md +++ b/pages/tutorials/Gulp.md @@ -394,11 +394,12 @@ cat dist/bundle.js ## Babel -First install Babelify. +First install Babelify and the Babel preset for ES2015. Like Uglify, Babelify mangles code, so we'll need vinyl-buffer and gulp-sourcemaps. +By default Babelify will only process files with extensions of `.js`, `.es`, `.es6` and `.jsx` so we need to add the `.ts` extension as an option to Babelify. ```shell -npm install --save-dev babelify vinyl-buffer gulp-sourcemaps +npm install --save-dev babelify babel-preset-es2015 vinyl-buffer gulp-sourcemaps ``` Now change your gulpfile to the following: @@ -428,7 +429,10 @@ gulp.task('default', ['copyHtml'], function () { packageCache: {} }) .plugin(tsify) - .transform("babelify") + .transform('babelify', { + presets: ['es2015'], + extensions: ['.ts'] + }) .bundle() .pipe(source('bundle.js')) .pipe(buffer()) From daa38317dc60c386739ace7c50f967418267f22b Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Jun 2016 12:53:40 -0700 Subject: [PATCH 023/831] Added Angular 2 tutorial page. --- pages/tutorials/Angular 2.md | 6 ++++++ pages/tutorials/Gulp.md | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 pages/tutorials/Angular 2.md diff --git a/pages/tutorials/Angular 2.md b/pages/tutorials/Angular 2.md new file mode 100644 index 000000000..ccb43c51c --- /dev/null +++ b/pages/tutorials/Angular 2.md @@ -0,0 +1,6 @@ +Angular 2 is an upcoming framework built in TypeScript. +Using TypeScript with Angular is fairly easy to set up for this reason, as TypeScript fits right in. +The Angular team also supports TypeScript as a first-class citizen in their documentation. + +As a result, [Angular 2's site](https://angular.io) will always be the most up-to-date reference for using Angular with TypeScript. +Check out their [quick start guide here](https://angular.io/docs/ts/latest/quickstart.html) to start learning now! \ No newline at end of file diff --git a/pages/tutorials/Gulp.md b/pages/tutorials/Gulp.md index 7e02415c1..85b21071b 100644 --- a/pages/tutorials/Gulp.md +++ b/pages/tutorials/Gulp.md @@ -1,4 +1,3 @@ - This quick start guide will teach you how to build TypeScript with [gulp](http://gulpjs.com) and then add [Browserify](http://browserify.org), [uglify](http://lisperator.net/uglifyjs/), or [Watchify](https://github.com/substack/watchify) to the gulp pipeline. We assume that you're already using [Node.js](https://nodejs.org/) with [npm](https://www.npmjs.com/). From 86fa56d4f9fddb1be86e9d822d78f12c89eabe83 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 13 Jun 2016 12:34:16 -0700 Subject: [PATCH 024/831] Remove TS 2.0 flags --- pages/Compiler Options.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 9e096ca45..531f969f5 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -46,12 +46,10 @@ Option | Type | Default `--skipDefaultLibCheck` | `boolean` | `false` | Don't check a user-defined default lib file's valitidy. `--sourceMap` | `boolean` | `false` | Generates corresponding '.map' file. `--sourceRoot` | `string` | `null` | Specifies the location where debugger should locate TypeScript files instead of source locations. Use this flag if the sources will be located at run-time in a different location than that at design-time. The location specified will be embedded in the sourceMap to direct the debugger where the source files where be located. -`--strictNullChecks` | `boolean` | `false` | In strict null checking mode, the `null` and `undefined` values are not in the domain of every type and are only assignable to themselves and `any` (the one exception being that `undefined` is also assignable to `void`). `--stripInternal`[1] | `boolean` | `false` | Do not emit declarations for code that has an `/** @internal */` JSDoc annotation. `--suppressExcessPropertyErrors` | `boolean` | `false` | Suppress excess property checks for object literals. `--suppressImplicitAnyIndexErrors` | `boolean` | `false` | Suppress `--noImplicitAny` errors for indexing objects lacking index signatures. See [issue #1232](https://github.com/Microsoft/TypeScript/issues/1232#issuecomment-64510362) for more details. `--target`
`-t` | `string` | `"ES5"` | Specify ECMAScript target version: `'es3'` (default), `'es5'`, or `'es6'`. -`--traceResolution` | `boolean` | `false` | Report module resolution log messages. `--version`
`-v` | | | Print the compiler's version. `--watch`
`-w` | | | Run the compiler in watch mode. Watch input files and trigger recompilation on changes. From 4c93963b639473d9b02751c4b50900a5c0c1b564 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 13 Jun 2016 12:35:37 -0700 Subject: [PATCH 025/831] Revert "Remove TS 2.0 flags" This reverts commit 86fa56d4f9fddb1be86e9d822d78f12c89eabe83. --- pages/Compiler Options.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 531f969f5..9e096ca45 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -46,10 +46,12 @@ Option | Type | Default `--skipDefaultLibCheck` | `boolean` | `false` | Don't check a user-defined default lib file's valitidy. `--sourceMap` | `boolean` | `false` | Generates corresponding '.map' file. `--sourceRoot` | `string` | `null` | Specifies the location where debugger should locate TypeScript files instead of source locations. Use this flag if the sources will be located at run-time in a different location than that at design-time. The location specified will be embedded in the sourceMap to direct the debugger where the source files where be located. +`--strictNullChecks` | `boolean` | `false` | In strict null checking mode, the `null` and `undefined` values are not in the domain of every type and are only assignable to themselves and `any` (the one exception being that `undefined` is also assignable to `void`). `--stripInternal`[1] | `boolean` | `false` | Do not emit declarations for code that has an `/** @internal */` JSDoc annotation. `--suppressExcessPropertyErrors` | `boolean` | `false` | Suppress excess property checks for object literals. `--suppressImplicitAnyIndexErrors` | `boolean` | `false` | Suppress `--noImplicitAny` errors for indexing objects lacking index signatures. See [issue #1232](https://github.com/Microsoft/TypeScript/issues/1232#issuecomment-64510362) for more details. `--target`
`-t` | `string` | `"ES5"` | Specify ECMAScript target version: `'es3'` (default), `'es5'`, or `'es6'`. +`--traceResolution` | `boolean` | `false` | Report module resolution log messages. `--version`
`-v` | | | Print the compiler's version. `--watch`
`-w` | | | Run the compiler in watch mode. Watch input files and trigger recompilation on changes. From 97cf2f9f9561d7bc6a2c0caec5cc8f78ddf1e946 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 13 Jun 2016 13:05:13 -0700 Subject: [PATCH 026/831] Fx target default Fixes https://github.com/Microsoft/TypeScript/issues/9142 --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 531f969f5..de4e4a4ce 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -49,7 +49,7 @@ Option | Type | Default `--stripInternal`[1] | `boolean` | `false` | Do not emit declarations for code that has an `/** @internal */` JSDoc annotation. `--suppressExcessPropertyErrors` | `boolean` | `false` | Suppress excess property checks for object literals. `--suppressImplicitAnyIndexErrors` | `boolean` | `false` | Suppress `--noImplicitAny` errors for indexing objects lacking index signatures. See [issue #1232](https://github.com/Microsoft/TypeScript/issues/1232#issuecomment-64510362) for more details. -`--target`
`-t` | `string` | `"ES5"` | Specify ECMAScript target version: `'es3'` (default), `'es5'`, or `'es6'`. +`--target`
`-t` | `string` | `"ES3"` | Specify ECMAScript target version: `'es3'` (default), `'es5'`, or `'es6'`. `--version`
`-v` | | | Print the compiler's version. `--watch`
`-w` | | | Run the compiler in watch mode. Watch input files and trigger recompilation on changes. From 90d6c6f19b031eb95c3aeee668493bc7593c6a36 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 14 Jun 2016 13:55:11 -0700 Subject: [PATCH 027/831] Add new compiler options --- pages/Compiler Options.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 9e096ca45..01bfad396 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -4,10 +4,12 @@ Option | Type | Default -----------------------------------------------|-----------|--------------------------------|---------------------------------------------------------------------- `--allowJs` | `boolean` | `true` | Allow JavaScript files to be compiled. `--allowSyntheticDefaultImports` | `boolean` | `(module === "system")` | Allow default imports from modules with no default export. This does not affect code emit, just typechecking. -`--allowUnreachableCode` | `boolean` | `false` | Do not report errors on unreachable code. +`--allowUnreachableCode` | `boolean` | `false` | Do not report errors on unreachable code. `--allowUnusedLabels` | `boolean` | `false` | Do not report errors on unused labels. +`--baseUrl ` | `string` | | Base directory to resolve non-relative module names. See [Module Resolution documentation](./Module Resolution.md#base-url) for more details. `--charset` | `string` | `"utf8"` | The character set of the input files. `--declaration`
`-d` | `boolean` | `false` | Generates corresponding '.d.ts' file. +`--declarationDir` | `string` | | Output directory for generated declaration files. `--diagnostics` | `boolean` | `false` | Show diagnostic information. `--emitBOM` | `boolean` | `false` | Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. `--emitDecoratorMetadata`[1] | `boolean` | `false` | Emit design-type metadata for decorated declarations in source. See [issue #2577](https://github.com/Microsoft/TypeScript/issues/2577) for details. @@ -19,6 +21,8 @@ Option | Type | Default `--init` | | | Initializes a TypeScript project and creates a `tsconfig.json` file. `--isolatedModules` | `boolean` | `false` | Unconditionally emit imports for unresolved files. `--jsx` | `string` | `"Preserve"` | Support JSX in '.tsx' files: `'React'` or `'Preserve'`. See [JSX](./JSX.md). +`--lib` | `string[]`| | List of library files to be included in the compilation.
Possible values are:
► `es5`
► `es6`
► `es2015`
► `es7`
► `es2016`
► `es2017` `dom` `webworker` `scripthost`
► `es2015.core`
► `es2015.collection`
► `es2015.generator`
► `es2015.iterable`
► `es2015.promise`
► `es2015.proxy`
► `es2015.reflect`
► `es2015.symbol`
► `es2015.symbol.wellknown`
► `es2016.array.include`
► `es2017.object`
► `es2017.sharedmemory` +`--listEmittedFiles` | `boolean` | `false` | Print names of generated files part of the compilation. `--listFiles` | `boolean` | `false` | Print names of files part of the compilation. `--locale` | `string` | *(platform specific)* | The locale to use to show error messages, e.g. en-us. `--mapRoot` | `string` | `null` | Specifies the location where debugger should locate map files instead of generated locations. Use this flag if the .map files will be located at run-time in a different location than than the .js files. The location specified will be embedded in the sourceMap to direct the debugger where the map files where be located. @@ -31,31 +35,38 @@ Option | Type | Default `--noFallthroughCasesInSwitch` | `boolean` | `false` | Report errors for fallthrough cases in switch statement. `--noImplicitAny` | `boolean` | `false` | Raise error on expressions and declarations with an implied 'any' type. `--noImplicitReturns` | `boolean` | `false` | Report error when not all code paths in function return a value. +`--noImplicitThis` | `boolean` | `false` | Raise error on `this` expressions with an implied 'any' type. `--noImplicitUseStrict` | `boolean` | `false` | Do not emit `"use strict"` directives in module output. `--noLib` | `boolean` | `false` | Do not include the default library file (lib.d.ts). `--noResolve` | `boolean` | `false` | Do not add triple-slash references or module import targets to the list of compiled files. ~~`--out`~~ | `string` | `null` | DEPRECATED. Use `--outFile` instead. `--outDir` | `string` | `null` | Redirect output structure to the directory. `--outFile` | `string` | `null` | Concatenate and emit output to single file. The order of concatenation is determined by the list of files passed to the compiler on the command line along with triple-slash references and imports. See output file order documentation for more details. +`paths`[2] | `Object` | | List of path mapping entries for module names to locations relative to the `baseUrl`. See [Module Resolution documentation](./Module Resolution.md#path-mapping) for more details. `--preserveConstEnums` | `boolean` | `false` | Do not erase const enum declarations in generated code. See [const enums documentation](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#94-constant-enum-declarations) for more details. `--pretty`[1] | `boolean` | `false` | Stylize errors and messages using color and context. `--project`
`-p` | `string` | `null` | Compile a project given a valid configuration file.
The argument can be an file path to a valid JSON configuration file, or a directory path to a directory containing a `tsconfig.json` file.
See [tsconfig.json](./tsconfig.json.md) documentation for more details. `--reactNamespace` | `string` | `"React"` | Specifies the object invoked for `createElement` and `__spread` when targeting 'react' JSX emit. `--removeComments` | `boolean` | `false` | Remove all comments except copy-right header comments beginning with `/*!` `--rootDir` | `string` | *(common root directory is computed from the list of input files)* | Specifies the root directory of input files. Only use to control the output directory structure with `--outDir`. -`--skipDefaultLibCheck` | `boolean` | `false` | Don't check a user-defined default lib file's valitidy. +`rootDirs`[2] | `string[]`| | List of root folders whose combined content represent the structure of the project at runtime. See [Module Resolution documentation](./Module Resolution.md#virtual-directories-with-rootdirs) for more details. +`--skipLibCheck` | `boolean` | `false` | Don't check a the default library (`lib.d.ts`) file's valitidy. +`--skipDefaultLibCheck` | `boolean` | `false` | Don't check a user-defined default library (`*.d.ts`) file's valitidy. `--sourceMap` | `boolean` | `false` | Generates corresponding '.map' file. `--sourceRoot` | `string` | `null` | Specifies the location where debugger should locate TypeScript files instead of source locations. Use this flag if the sources will be located at run-time in a different location than that at design-time. The location specified will be embedded in the sourceMap to direct the debugger where the source files where be located. `--strictNullChecks` | `boolean` | `false` | In strict null checking mode, the `null` and `undefined` values are not in the domain of every type and are only assignable to themselves and `any` (the one exception being that `undefined` is also assignable to `void`). `--stripInternal`[1] | `boolean` | `false` | Do not emit declarations for code that has an `/** @internal */` JSDoc annotation. `--suppressExcessPropertyErrors` | `boolean` | `false` | Suppress excess property checks for object literals. `--suppressImplicitAnyIndexErrors` | `boolean` | `false` | Suppress `--noImplicitAny` errors for indexing objects lacking index signatures. See [issue #1232](https://github.com/Microsoft/TypeScript/issues/1232#issuecomment-64510362) for more details. -`--target`
`-t` | `string` | `"ES5"` | Specify ECMAScript target version: `'es3'` (default), `'es5'`, or `'es6'`. +`--target`
`-t` | `string` | `"ES3"` | Specify ECMAScript target version: `'es3'` (default), `'es5'`, or `'es6'`. `--traceResolution` | `boolean` | `false` | Report module resolution log messages. +`--types` | `string[]`| | List of names of type definitions to include. +`--typeRoots` | `string[]`| | List of folders to include type definitions from. `--version`
`-v` | | | Print the compiler's version. `--watch`
`-w` | | | Run the compiler in watch mode. Watch input files and trigger recompilation on changes. [1] These options are experimental. +[2] These options are alowed in `tsconfig.json` files only and not through commandline switchs. ## Related From 95e78f941a47fb19250d62bd332919f2cd003a28 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 14 Jun 2016 13:57:00 -0700 Subject: [PATCH 028/831] Sort alphapitaclly --- pages/Compiler Options in MSBuild.md | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index 8ef72c22a..771fb2ca0 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -22,51 +22,51 @@ Compiler options can be specified using MSBuild properties within an MSBuild pro Compiler Option | MSBuild Property Name | Allowed Values ---------------------------------------------|--------------------------------------------|----------------- -`--declaration` | TypeScriptGeneratesDeclarations | boolean -`--module` | TypeScriptModuleKind | `AMD`, `CommonJs`, `UMD`, or `System` -`--target` | TypeScriptTarget | `ES3`, `ES5`, or `ES6` +`--allowJs` | *Not supported in VS* | +`--allowSyntheticDefaultImports` | TypeScriptAllowSyntheticDefaultImports | boolean +`--allowUnreachableCode` | TypeScriptAllowUnreachableCode | boolean +`--allowUnusedLabels` | TypeScriptAllowUnusedLabels | boolean `--charset` | TypeScriptCharset | +`--declaration` | TypeScriptGeneratesDeclarations | boolean +`--diagnostics` | *Not supported in VS* | `--emitBOM` | TypeScriptEmitBOM | boolean `--emitDecoratorMetadata` | TypeScriptEmitDecoratorMetadata | boolean +`--experimentalAsyncFunctions` | TypeScriptExperimentalAsyncFunctions | boolean `--experimentalDecorators` | TypeScriptExperimentalDecorators | boolean +`--forceConsistentCasingInFileNames` | TypeScriptForceConsistentCasingInFileNames | boolean `--inlineSourceMap` | TypeScriptInlineSourceMap | boolean `--inlineSources` | TypeScriptInlineSources | boolean +`--isolatedModules` | TypeScriptIsolatedModules | boolean +`--jsx` | TypeScriptJSXEmit | `React` or `Preserve` +`--listFiles` | *Not supported in VS* | `--locale` | *automatic* | Automatically set to PreferredUILang value `--mapRoot` | TypeScriptMapRoot | File path +`--module` | TypeScriptModuleKind | `AMD`, `CommonJs`, `UMD`, or `System` +`--moduleResolution` | TypeScriptModuleResolution | `Classic` or `Node` `--newLine` | TypeScriptNewLine | `CRLF` or `LF` -`--noEmitOnError` | TypeScriptNoEmitOnError | boolean +`--noEmit` | *Not supported in VS* | `--noEmitHelpers` | TypeScriptNoEmitHelpers | boolean +`--noEmitOnError` | TypeScriptNoEmitOnError | boolean +`--noFallthroughCasesInSwitch` | TypeScriptNoFallthroughCasesInSwitch | boolean `--noImplicitAny` | TypeScriptNoImplicitAny | boolean +`--noImplicitReturns` | TypeScriptNoImplicitReturns | boolean +`--noImplicitUseStrict` | TypeScriptNoImplicitUseStrict | boolean `--noLib` | TypeScriptNoLib | boolean `--noResolve` | TypeScriptNoResolve | boolean `--out` | TypeScriptOutFile | File path `--outDir` | TypeScriptOutDir | File path `--preserveConstEnums` | TypeScriptPreserveConstEnums | boolean +`--project` | *Not supported in VS* | +`--reactNamespace` | TypeScriptReactNamespace | string `--removeComments` | TypeScriptRemoveComments | boolean `--rootDir` | TypeScriptRootDir | File path -`--isolatedModules` | TypeScriptIsolatedModules | boolean +`--skipDefaultLibCheck` | TypeScriptSkipDefaultLibCheck | boolean `--sourceMap` | TypeScriptSourceMap | File path `--sourceRoot` | TypeScriptSourceRoot | File path -`--suppressImplicitAnyIndexErrors` | TypeScriptSuppressImplicitAnyIndexErrors | boolean `--suppressExcessPropertyErrors` | TypeScriptSuppressExcessPropertyErrors | boolean -`--moduleResolution` | TypeScriptModuleResolution | `Classic` or `Node` -`--experimentalAsyncFunctions` | TypeScriptExperimentalAsyncFunctions | boolean -`--jsx` | TypeScriptJSXEmit | `React` or `Preserve` -`--reactNamespace` | TypeScriptReactNamespace | string -`--skipDefaultLibCheck` | TypeScriptSkipDefaultLibCheck | boolean -`--allowUnusedLabels` | TypeScriptAllowUnusedLabels | boolean -`--noImplicitReturns` | TypeScriptNoImplicitReturns | boolean -`--noFallthroughCasesInSwitch` | TypeScriptNoFallthroughCasesInSwitch | boolean -`--allowUnreachableCode` | TypeScriptAllowUnreachableCode | boolean -`--forceConsistentCasingInFileNames` | TypeScriptForceConsistentCasingInFileNames | boolean -`--allowSyntheticDefaultImports` | TypeScriptAllowSyntheticDefaultImports | boolean -`--noImplicitUseStrict` | TypeScriptNoImplicitUseStrict | boolean -`--project` | *Not supported in VS* | +`--suppressImplicitAnyIndexErrors` | TypeScriptSuppressImplicitAnyIndexErrors | boolean +`--target` | TypeScriptTarget | `ES3`, `ES5`, or `ES6` `--watch` | *Not supported in VS* | -`--diagnostics` | *Not supported in VS* | -`--listFiles` | *Not supported in VS* | -`--noEmit` | *Not supported in VS* | -`--allowJs` | *Not supported in VS* | *VS only option* | TypeScriptAdditionalFlags | *Any compiler option* ## What is supported in my version of Visual Studio? From e48d0add58f12d5449d0fb97bf22f389cb9f8eb7 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 14 Jun 2016 14:10:38 -0700 Subject: [PATCH 029/831] Add MSBuild mappings --- pages/Compiler Options in MSBuild.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index 771fb2ca0..f05e8bc45 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -26,22 +26,28 @@ Compiler Option | MSBuild Property Name `--allowSyntheticDefaultImports` | TypeScriptAllowSyntheticDefaultImports | boolean `--allowUnreachableCode` | TypeScriptAllowUnreachableCode | boolean `--allowUnusedLabels` | TypeScriptAllowUnusedLabels | boolean +`--baseUrl` | TypeScriptBaseUrl | File path `--charset` | TypeScriptCharset | `--declaration` | TypeScriptGeneratesDeclarations | boolean +`--declarationDir` | TypeScriptDeclarationDir | File path `--diagnostics` | *Not supported in VS* | `--emitBOM` | TypeScriptEmitBOM | boolean `--emitDecoratorMetadata` | TypeScriptEmitDecoratorMetadata | boolean `--experimentalAsyncFunctions` | TypeScriptExperimentalAsyncFunctions | boolean `--experimentalDecorators` | TypeScriptExperimentalDecorators | boolean `--forceConsistentCasingInFileNames` | TypeScriptForceConsistentCasingInFileNames | boolean +`--help` | *Not supported in VS* | `--inlineSourceMap` | TypeScriptInlineSourceMap | boolean `--inlineSources` | TypeScriptInlineSources | boolean +`--init` | *Not supported in VS* | `--isolatedModules` | TypeScriptIsolatedModules | boolean `--jsx` | TypeScriptJSXEmit | `React` or `Preserve` +`--lib` | TypeScriptLib | Comma-separated list of strings +`--listEmittedFiles` | *Not supported in VS* | `--listFiles` | *Not supported in VS* | `--locale` | *automatic* | Automatically set to PreferredUILang value `--mapRoot` | TypeScriptMapRoot | File path -`--module` | TypeScriptModuleKind | `AMD`, `CommonJs`, `UMD`, or `System` +`--module` | TypeScriptModuleKind | `AMD`, `CommonJs`, `UMD`, `System` or `ES6` `--moduleResolution` | TypeScriptModuleResolution | `Classic` or `Node` `--newLine` | TypeScriptNewLine | `CRLF` or `LF` `--noEmit` | *Not supported in VS* | @@ -50,22 +56,32 @@ Compiler Option | MSBuild Property Name `--noFallthroughCasesInSwitch` | TypeScriptNoFallthroughCasesInSwitch | boolean `--noImplicitAny` | TypeScriptNoImplicitAny | boolean `--noImplicitReturns` | TypeScriptNoImplicitReturns | boolean +`--noImplicitThis` | TypeScriptNoImplicitThis | boolean `--noImplicitUseStrict` | TypeScriptNoImplicitUseStrict | boolean `--noLib` | TypeScriptNoLib | boolean `--noResolve` | TypeScriptNoResolve | boolean `--out` | TypeScriptOutFile | File path `--outDir` | TypeScriptOutDir | File path +`--outFile` | TypeScriptOutFile | File path +`--paths` | *Not supported in VS* | `--preserveConstEnums` | TypeScriptPreserveConstEnums | boolean -`--project` | *Not supported in VS* | +`--listEmittedFiles` | *Not supported in VS* | +`--pretty` | *Not supported in VS* | `--reactNamespace` | TypeScriptReactNamespace | string `--removeComments` | TypeScriptRemoveComments | boolean `--rootDir` | TypeScriptRootDir | File path +`--rootDirs` | *Not supported in VS* | +`--skipLibCheck` | TypeScriptSkipLibCheck | boolean `--skipDefaultLibCheck` | TypeScriptSkipDefaultLibCheck | boolean `--sourceMap` | TypeScriptSourceMap | File path `--sourceRoot` | TypeScriptSourceRoot | File path +`--strictNullChecks` | TypeScriptStrictNullChecks | File path `--suppressExcessPropertyErrors` | TypeScriptSuppressExcessPropertyErrors | boolean `--suppressImplicitAnyIndexErrors` | TypeScriptSuppressImplicitAnyIndexErrors | boolean `--target` | TypeScriptTarget | `ES3`, `ES5`, or `ES6` +`--traceResolution` | *Not supported in VS* | +`--types` | TypeScriptTypes | Comma-separated list of strings +`--typeRoots` | TypeScriptTypeRoots | Comma-separated list of file path `--watch` | *Not supported in VS* | *VS only option* | TypeScriptAdditionalFlags | *Any compiler option* From 40d4a962c8bc064794d4194bc9c675e58f424830 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 14 Jun 2016 14:12:22 -0700 Subject: [PATCH 030/831] Update message to use MSBuild instead of VS --- pages/Compiler Options in MSBuild.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index f05e8bc45..2840ae525 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -22,7 +22,7 @@ Compiler options can be specified using MSBuild properties within an MSBuild pro Compiler Option | MSBuild Property Name | Allowed Values ---------------------------------------------|--------------------------------------------|----------------- -`--allowJs` | *Not supported in VS* | +`--allowJs` | *Not supported in MSBuild* | `--allowSyntheticDefaultImports` | TypeScriptAllowSyntheticDefaultImports | boolean `--allowUnreachableCode` | TypeScriptAllowUnreachableCode | boolean `--allowUnusedLabels` | TypeScriptAllowUnusedLabels | boolean @@ -30,27 +30,27 @@ Compiler Option | MSBuild Property Name `--charset` | TypeScriptCharset | `--declaration` | TypeScriptGeneratesDeclarations | boolean `--declarationDir` | TypeScriptDeclarationDir | File path -`--diagnostics` | *Not supported in VS* | +`--diagnostics` | *Not supported in MSBuild* | `--emitBOM` | TypeScriptEmitBOM | boolean `--emitDecoratorMetadata` | TypeScriptEmitDecoratorMetadata | boolean `--experimentalAsyncFunctions` | TypeScriptExperimentalAsyncFunctions | boolean `--experimentalDecorators` | TypeScriptExperimentalDecorators | boolean `--forceConsistentCasingInFileNames` | TypeScriptForceConsistentCasingInFileNames | boolean -`--help` | *Not supported in VS* | +`--help` | *Not supported in MSBuild* | `--inlineSourceMap` | TypeScriptInlineSourceMap | boolean `--inlineSources` | TypeScriptInlineSources | boolean -`--init` | *Not supported in VS* | +`--init` | *Not supported in MSBuild* | `--isolatedModules` | TypeScriptIsolatedModules | boolean `--jsx` | TypeScriptJSXEmit | `React` or `Preserve` `--lib` | TypeScriptLib | Comma-separated list of strings -`--listEmittedFiles` | *Not supported in VS* | -`--listFiles` | *Not supported in VS* | +`--listEmittedFiles` | *Not supported in MSBuild* | +`--listFiles` | *Not supported in MSBuild* | `--locale` | *automatic* | Automatically set to PreferredUILang value `--mapRoot` | TypeScriptMapRoot | File path `--module` | TypeScriptModuleKind | `AMD`, `CommonJs`, `UMD`, `System` or `ES6` `--moduleResolution` | TypeScriptModuleResolution | `Classic` or `Node` `--newLine` | TypeScriptNewLine | `CRLF` or `LF` -`--noEmit` | *Not supported in VS* | +`--noEmit` | *Not supported in MSBuild* | `--noEmitHelpers` | TypeScriptNoEmitHelpers | boolean `--noEmitOnError` | TypeScriptNoEmitOnError | boolean `--noFallthroughCasesInSwitch` | TypeScriptNoFallthroughCasesInSwitch | boolean @@ -63,14 +63,14 @@ Compiler Option | MSBuild Property Name `--out` | TypeScriptOutFile | File path `--outDir` | TypeScriptOutDir | File path `--outFile` | TypeScriptOutFile | File path -`--paths` | *Not supported in VS* | +`--paths` | *Not supported in MSBuild* | `--preserveConstEnums` | TypeScriptPreserveConstEnums | boolean -`--listEmittedFiles` | *Not supported in VS* | -`--pretty` | *Not supported in VS* | +`--listEmittedFiles` | *Not supported in MSBuild* | +`--pretty` | *Not supported in MSBuild* | `--reactNamespace` | TypeScriptReactNamespace | string `--removeComments` | TypeScriptRemoveComments | boolean `--rootDir` | TypeScriptRootDir | File path -`--rootDirs` | *Not supported in VS* | +`--rootDirs` | *Not supported in MSBuild* | `--skipLibCheck` | TypeScriptSkipLibCheck | boolean `--skipDefaultLibCheck` | TypeScriptSkipDefaultLibCheck | boolean `--sourceMap` | TypeScriptSourceMap | File path @@ -79,11 +79,11 @@ Compiler Option | MSBuild Property Name `--suppressExcessPropertyErrors` | TypeScriptSuppressExcessPropertyErrors | boolean `--suppressImplicitAnyIndexErrors` | TypeScriptSuppressImplicitAnyIndexErrors | boolean `--target` | TypeScriptTarget | `ES3`, `ES5`, or `ES6` -`--traceResolution` | *Not supported in VS* | +`--traceResolution` | *Not supported in MSBuild* | `--types` | TypeScriptTypes | Comma-separated list of strings `--typeRoots` | TypeScriptTypeRoots | Comma-separated list of file path -`--watch` | *Not supported in VS* | -*VS only option* | TypeScriptAdditionalFlags | *Any compiler option* +`--watch` | *Not supported in MSBuild* | +*MSBuild only option* | TypeScriptAdditionalFlags | *Any compiler option* ## What is supported in my version of Visual Studio? From 06a19b63bb5d8d5b3db000b41d6cf4288a163df1 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 14 Jun 2016 14:12:33 -0700 Subject: [PATCH 031/831] Formatting --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 01bfad396..77828627c 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -6,7 +6,7 @@ Option | Type | Default `--allowSyntheticDefaultImports` | `boolean` | `(module === "system")` | Allow default imports from modules with no default export. This does not affect code emit, just typechecking. `--allowUnreachableCode` | `boolean` | `false` | Do not report errors on unreachable code. `--allowUnusedLabels` | `boolean` | `false` | Do not report errors on unused labels. -`--baseUrl ` | `string` | | Base directory to resolve non-relative module names. See [Module Resolution documentation](./Module Resolution.md#base-url) for more details. +`--baseUrl` | `string` | | Base directory to resolve non-relative module names. See [Module Resolution documentation](./Module Resolution.md#base-url) for more details. `--charset` | `string` | `"utf8"` | The character set of the input files. `--declaration`
`-d` | `boolean` | `false` | Generates corresponding '.d.ts' file. `--declarationDir` | `string` | | Output directory for generated declaration files. From c08fbe8eb3290a409b8432c6180f86d3fb3c522f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 14 Jun 2016 14:23:08 -0700 Subject: [PATCH 032/831] Update Compiler Options.md --- pages/Compiler Options.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 77828627c..a815b3e20 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -65,8 +65,8 @@ Option | Type | Default `--version`
`-v` | | | Print the compiler's version. `--watch`
`-w` | | | Run the compiler in watch mode. Watch input files and trigger recompilation on changes. -[1] These options are experimental. -[2] These options are alowed in `tsconfig.json` files only and not through commandline switchs. +* [1] These options are experimental. +* [2] These options are only allowed in `tsconfig.json`, and not through command-line switches. ## Related From 8224a6aeb009f273ad0b9d259b605bedd5b68e2f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 15 Jun 2016 14:10:01 -0700 Subject: [PATCH 033/831] Update Compiler Options in MSBuild.md --- pages/Compiler Options in MSBuild.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index 2840ae525..e918a8184 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -80,8 +80,8 @@ Compiler Option | MSBuild Property Name `--suppressImplicitAnyIndexErrors` | TypeScriptSuppressImplicitAnyIndexErrors | boolean `--target` | TypeScriptTarget | `ES3`, `ES5`, or `ES6` `--traceResolution` | *Not supported in MSBuild* | -`--types` | TypeScriptTypes | Comma-separated list of strings -`--typeRoots` | TypeScriptTypeRoots | Comma-separated list of file path +`--types` | *Not supported in MSBuild* | +`--typeRoots` | *Not supported in MSBuild* | `--watch` | *Not supported in MSBuild* | *MSBuild only option* | TypeScriptAdditionalFlags | *Any compiler option* @@ -102,4 +102,4 @@ Users using newer versions of TS, will see a prompt to upgrade their project on ## TypeScriptCompileBlocked If you are using a different build tool to build your project (e.g. gulp, grunt , etc.) and VS for the development and debugging experience, set `true` in your project. -This should give you all the editing support, but not the build when you hit F5. \ No newline at end of file +This should give you all the editing support, but not the build when you hit F5. From 848ee47ba93dd2027b43430c0941a0b817dde419 Mon Sep 17 00:00:00 2001 From: Liam Monahan Date: Thu, 16 Jun 2016 16:50:47 +0200 Subject: [PATCH 034/831] Fixed a typo. --- pages/Variable Declarations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index aa3f63895..e4be42e78 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -175,8 +175,8 @@ for (var i = 0; i < 10; i++) { } ``` -This odd-looking pattern is actually a commonplace. -The `i` in the parameter actually shadows the `i` declared in the `for` loop, but since we named it the same, we didn't have to modify the loop body too much. +This odd-looking pattern is actually commonplace. +The `i` in the parameter list actually shadows the `i` declared in the `for` loop, but since we named it the same, we didn't have to modify the loop body too much. # `let` declarations From f7f9f7379d9b1a9e4b431f3faae3ef1c081e9583 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 16 Jun 2016 10:55:14 -0700 Subject: [PATCH 035/831] Update Variable Declarations.md --- pages/Variable Declarations.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index e4be42e78..ccd6d0e16 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -175,12 +175,12 @@ for (var i = 0; i < 10; i++) { } ``` -This odd-looking pattern is actually commonplace. -The `i` in the parameter list actually shadows the `i` declared in the `for` loop, but since we named it the same, we didn't have to modify the loop body too much. +This odd-looking pattern is actually pretty common. +The `i` in the parameter list actually shadows the `i` declared in the `for` loop, but since we named them the same, we didn't have to modify the loop body too much. # `let` declarations -By now you've figured out that `var` has some problems, which is precisely why `let` statements are a new way to declare variables. +By now you've figured out that `var` has some problems, which is precisely why `let` statements were introduced. Apart from the keyword used, `let` statements are written the same way `var` statements are. ```ts From 270622a2af04132ff2b3901e98861baad1e2fa4d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 16 Jun 2016 11:00:29 -0700 Subject: [PATCH 036/831] Update Variable Declarations.md --- pages/Variable Declarations.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index ccd6d0e16..04db3dc47 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -155,11 +155,10 @@ Most people expect the output to be ``` Remember what we mentioned earlier about variable capturing? +Every function expression we pass to `setTimeout` actually refers to the same `i` from the same scope. -> At any point that `g` gets called, the value of `a` will be tied to the value of `a` in `f`. - -Let's take a minute to consider that in this context. -`setTimeout` will run a function after some number of milliseconds, and also after the `for` loop has stopped executing. +Let's take a minute to consider that means. +`setTimeout` will run a function after some number of milliseconds, *but only* after the `for` loop has stopped executing; By the time the `for` loop has stopped executing, the value of `i` is `10`. So each time the given function gets called, it will print out `10`! From 9c965e662d10d02af16dae8fcf0549eb3aac2f84 Mon Sep 17 00:00:00 2001 From: Michael Huynh Date: Sat, 18 Jun 2016 20:30:40 +0800 Subject: [PATCH 037/831] Fix spelling and grammar mistake Corrects a heading typo for the *Modules* section and a small grammar mistake in the *Module Resolution* section. --- pages/Module Resolution.md | 2 +- pages/Modules.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index d537ff1c4..cc389defc 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -205,4 +205,4 @@ That was `tsconfig.json` automatic inclusion. That does not embed module resolution as discussed above. If the compiler identified a file as a target of a module import, it will be included in the compilation regardless if it was excluded in the previous steps. -So to exclude a file from the compilation, you need to exclude it and all **all** files that has an `import` or `/// ` directives to it. +So to exclude a file from the compilation, you need to exclude it and **all** files that have an `import` or `/// ` directive to it. diff --git a/pages/Modules.md b/pages/Modules.md index 9689f8b4c..7d669d910 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -557,7 +557,7 @@ export function someFunc() { /* ... */ } Conversly when importing: -### Explicitlly list imported names +### Explicitly list imported names #### Consumer.ts From 753ea50a86b9382aedec5fbcfe1f91d8f47d631a Mon Sep 17 00:00:00 2001 From: Michael Huynh Date: Sat, 18 Jun 2016 20:51:01 +0800 Subject: [PATCH 038/831] Remove trailing white space in variable declarations section This should stop the linter complaining and failing the build. --- pages/Variable Declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index 04db3dc47..b1f7d2c9b 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -155,7 +155,7 @@ Most people expect the output to be ``` Remember what we mentioned earlier about variable capturing? -Every function expression we pass to `setTimeout` actually refers to the same `i` from the same scope. +Every function expression we pass to `setTimeout` actually refers to the same `i` from the same scope. Let's take a minute to consider that means. `setTimeout` will run a function after some number of milliseconds, *but only* after the `for` loop has stopped executing; From 62201fbef6bcc105dd90c7eea0ca7f2962399086 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Sat, 18 Jun 2016 11:41:03 -0700 Subject: [PATCH 039/831] Remove trailing spaces. --- pages/Variable Declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index 04db3dc47..b1f7d2c9b 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -155,7 +155,7 @@ Most people expect the output to be ``` Remember what we mentioned earlier about variable capturing? -Every function expression we pass to `setTimeout` actually refers to the same `i` from the same scope. +Every function expression we pass to `setTimeout` actually refers to the same `i` from the same scope. Let's take a minute to consider that means. `setTimeout` will run a function after some number of milliseconds, *but only* after the `for` loop has stopped executing; From 160fac387109cf6caa6f923522ae161c29424de8 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Sat, 18 Jun 2016 11:36:18 -0700 Subject: [PATCH 040/831] Add missing parameter name. --- pages/Writing Declaration Files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Writing Declaration Files.md b/pages/Writing Declaration Files.md index d3a75da7a..5e8350195 100644 --- a/pages/Writing Declaration Files.md +++ b/pages/Writing Declaration Files.md @@ -262,7 +262,7 @@ addLater(3, 4, x => console.log("x = " + x)); ```ts // Note: 'void' return type is preferred here -function addLater(x: number, y: number, (sum: number) => void): void; +function addLater(x: number, y: number, callback: (sum: number) => void): void; ``` Please post a comment [here](https://github.com/Microsoft/TypeScript-Handbook/issues) if there's a pattern you'd like to see documented! From c3b45c7779e420662dbc647d853b2edc99454f3e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 21 Jun 2016 16:43:23 -0700 Subject: [PATCH 041/831] Fix https://github.com/Microsoft/TypeScript-Handbook/issues/306 Fix rootDirs names --- pages/Module Resolution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index dec469e3d..105b762b1 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -309,7 +309,7 @@ So following our example, the `tsconfig.json` file should look like: "compilerOptions": { "rootDirs": [ "src/views", - "generated/templates" + "generated/templates/views" ] } } From ab93457360aa602fef924f12f700cb87f4f4ae89 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 22 Jun 2016 22:53:33 -0700 Subject: [PATCH 042/831] Added a section on the 'null' and 'undefined' types. --- pages/Basic Types.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index 0d40b5f2e..5ce074838 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -190,6 +190,23 @@ Declaring variables of type `void` is not useful because you can only assign `un let unusable: void = undefined; ``` +# Null and Undefined + +In TypeScript, both `undefined` and `null` actually have their own types named `undefined` and `null` respectively. +Much like `void`, they're not extremely useful on their own: + +```ts +// Not much else we can assign to these variables! +let u: undefined = undefined; +let n: null = null; +``` + +However, when using the `--strictNullChecks` flag, these types can be combined with *union types* in interesting ways, which we'll cover later on. + +When not using `--strictNullChecks`, `null` and `undefined` are in the domain of all types. + +> As a note: we encourage the use of `--strictNullChecks` when possible, but for the purposes of this handbook, we will assume it is turned off. + # Type assertions Sometimes you'll end up in a situation where you'll know more about a value than TypeScript does. From 846021d34c1382f866d5f2aa31e805964093fcb3 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 22 Jun 2016 22:55:36 -0700 Subject: [PATCH 043/831] Fixed trailing spaces. --- pages/Compiler Options in MSBuild.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index e918a8184..b162f3030 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -80,7 +80,7 @@ Compiler Option | MSBuild Property Name `--suppressImplicitAnyIndexErrors` | TypeScriptSuppressImplicitAnyIndexErrors | boolean `--target` | TypeScriptTarget | `ES3`, `ES5`, or `ES6` `--traceResolution` | *Not supported in MSBuild* | -`--types` | *Not supported in MSBuild* | +`--types` | *Not supported in MSBuild* | `--typeRoots` | *Not supported in MSBuild* | `--watch` | *Not supported in MSBuild* | *MSBuild only option* | TypeScriptAdditionalFlags | *Any compiler option* From dd7c6d9fae799c373133ae880a5082eea3a5d698 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 22 Jun 2016 23:06:00 -0700 Subject: [PATCH 044/831] Rephrasing. --- pages/Basic Types.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index 5ce074838..0b3d34ed1 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -201,9 +201,13 @@ let u: undefined = undefined; let n: null = null; ``` -However, when using the `--strictNullChecks` flag, these types can be combined with *union types* in interesting ways, which we'll cover later on. +By default `null` and `undefined` are subtypes of all other types. +That means you can assign `null` and `undefined` to something like `number`. -When not using `--strictNullChecks`, `null` and `undefined` are in the domain of all types. +However, when using the `--strictNullChecks` flag, `null` and `undefined` are only assignable to `void` and their respective types. +This helps avoid *many* common errors. +In cases where you wanted to pass in either a `string` or `null` or `undefined`, you can use the union type `string | null | undefined`. +Once again, more on union types later on. > As a note: we encourage the use of `--strictNullChecks` when possible, but for the purposes of this handbook, we will assume it is turned off. From 30ca8eaea73e2c691a0ed74b950c1d1c17b6807e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 23 Jun 2016 12:01:48 -0700 Subject: [PATCH 045/831] Update moduleResolution default logic --- pages/Compiler Options.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index de4e4a4ce..858932b00 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -22,8 +22,8 @@ Option | Type | Default `--listFiles` | `boolean` | `false` | Print names of files part of the compilation. `--locale` | `string` | *(platform specific)* | The locale to use to show error messages, e.g. en-us. `--mapRoot` | `string` | `null` | Specifies the location where debugger should locate map files instead of generated locations. Use this flag if the .map files will be located at run-time in a different location than than the .js files. The location specified will be embedded in the sourceMap to direct the debugger where the map files where be located. -`--module`
`-m` | `string` | `(target === "ES6" ? "ES6" : "CommonJS")` | Specify module code generation: `'none'`, `'commonjs'`, `'amd'`, `'system'`, `'umd'`, `'es6'`, or `'es2015'`.
► Only `'amd'` and `'system'` can be used in conjunction with `--outFile`.
► `'es6'` and `'es2015'` values may not be used when targeting ES5 or lower. -`--moduleResolution` | `string` | `"Classic"` | Determine how modules get resolved. Either `'node'` for Node.js/io.js style resolution, or `'classic'` (default). See [Module Resolution documentation](Module Resolution.md) for more details. +`--module`
`-m` | `string` | `(target === 'ES6' ? 'ES6' : 'commonjs')` | Specify module code generation: `'none'`, `'commonjs'`, `'amd'`, `'system'`, `'umd'`, `'es6'`, or `'es2015'`.
► Only `'amd'` and `'system'` can be used in conjunction with `--outFile`.
► `'es6'` and `'es2015'` values may not be used when targeting ES5 or lower. +`--moduleResolution` | `string` | `(module === 'amd' | 'system' | 'ES6' ? 'classic' : 'node')` | Determine how modules get resolved. Either `'node'` for Node.js/io.js style resolution, or `'classic'` (default). See [Module Resolution documentation](Module Resolution.md) for more details. `--newLine` | `string` | *(platform specific)* | Use the specified end of line sequence to be used when emitting files: `'crlf'` (windows) or `'lf'` (unix)." `--noEmit` | `boolean` | `false` | Do not emit outputs. `--noEmitHelpers` | `boolean` | `false` | Do not generate custom helper functions like `__extends` in compiled output. From 0779597b85c360f0f2ce28a3a7f49eec06fa3fdb Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 23 Jun 2016 15:58:13 -0700 Subject: [PATCH 046/831] Update Basic Types.md --- pages/Basic Types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index 0b3d34ed1..fab64ba57 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -206,7 +206,7 @@ That means you can assign `null` and `undefined` to something like `number`. However, when using the `--strictNullChecks` flag, `null` and `undefined` are only assignable to `void` and their respective types. This helps avoid *many* common errors. -In cases where you wanted to pass in either a `string` or `null` or `undefined`, you can use the union type `string | null | undefined`. +In cases where you want to pass in either a `string` or `null` or `undefined`, you can use the union type `string | null | undefined`. Once again, more on union types later on. > As a note: we encourage the use of `--strictNullChecks` when possible, but for the purposes of this handbook, we will assume it is turned off. From df1ae408a44f4e698d7f2f5a053ea79d03a1b60d Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 24 Jun 2016 07:29:02 -0700 Subject: [PATCH 047/831] Add documentation for shorthand ambient modules --- pages/Modules.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pages/Modules.md b/pages/Modules.md index 9689f8b4c..e72bcb733 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -500,6 +500,23 @@ import * as URL from "url"; let myUrl = URL.parse("http://www.typescriptlang.org"); ``` +### Shorthand ambient modules + +If you don't want to take the time to write out declarations before using a new module, you can use a shorthand declaration to get started quickly. + +##### declarations.d.ts + +```ts +declare module "hot-new-module"; +``` + +All imports from a shorthand module with have the `any` type. + +```ts +import x, {y} from "hot-new-module"; +x(y); +``` + # Guidance for structuring modules ## Export as close to top-level as possible From cb1211b24c9d90ba1a5be975c4ad83e97d788bab Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 24 Jun 2016 07:59:51 -0700 Subject: [PATCH 048/831] Document wildcard module declarations --- pages/Module Resolution.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 105b762b1..226333d95 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -42,6 +42,33 @@ A non-relative import can be resolved relative to `baseUrl`, or through path map They can also resolve to [ambient module declarations](./Modules.md#ambient-modules). Use non-relative paths when importing any of your external dependnecies. +## Wildcard module declarations + +Some module loaders such as [SystemJS](https://github.com/systemjs/systemjs/blob/master/docs/overview.md#plugin-syntax) +and [AMD](https://github.com/amdjs/amdjs-api/blob/master/LoaderPlugins.md) allow non-JavaScript content to be imported. +These typically use a prefix or suffix to indicate the special loading semantics. +Wildcard module declarations can be used to cover these cases. + +```ts +declare module "*!text" { + const content: string; + export default content; +} +// Some do it the other way around. +declare module "json!*" { + const value: any; + export default value; +} +``` + +Imports of the kind "*!text" and "json!*" can now be used. + +```ts +import fileContent from "./xyz.txt!text"; +import data from "json!http://example.com/data.json"; +console.log(data, fileContent); +``` + ## Module Resolution Strategies There are two possible module resolution strategies: [Node](#node) and [Classic](#classic). From 7b2c80ab7c2537f2e3e4188f32805bd3ea45cb26 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 24 Jun 2016 09:45:07 -0700 Subject: [PATCH 049/831] Fix typo --- pages/Modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Modules.md b/pages/Modules.md index e72bcb733..91524cd7b 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -510,7 +510,7 @@ If you don't want to take the time to write out declarations before using a new declare module "hot-new-module"; ``` -All imports from a shorthand module with have the `any` type. +All imports from a shorthand module will have the `any` type. ```ts import x, {y} from "hot-new-module"; From c22c6a4d588cedc75e3c4da8560b08c3a0bb4008 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 24 Jun 2016 09:51:16 -0700 Subject: [PATCH 050/831] Respond to PR comment --- pages/Module Resolution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 226333d95..7bfd61c9e 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -61,7 +61,7 @@ declare module "json!*" { } ``` -Imports of the kind "*!text" and "json!*" can now be used. +Now you can import things that match `"*!text"` or `"json!*"`. ```ts import fileContent from "./xyz.txt!text"; From b924a34dab6728414f56e3caa6275ba52990e7d1 Mon Sep 17 00:00:00 2001 From: Dan Marshall Date: Fri, 24 Jun 2016 10:34:26 -0700 Subject: [PATCH 051/831] Added table of contents --- pages/Integrating with Build Tools.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pages/Integrating with Build Tools.md b/pages/Integrating with Build Tools.md index e53d5ee7d..4e9225929 100644 --- a/pages/Integrating with Build Tools.md +++ b/pages/Integrating with Build Tools.md @@ -1,3 +1,13 @@ +Build tools +* [Browserify](#browserify) +* [Duo](#duo) +* [Grunt](#grunt) +* [Gulp](#gulp) +* [Jspm](#jspm) +* [Webpack](#webpack) +* [MSBuild](#msbuild) +* [NuGet](#nuget) + # Browserify ### Install @@ -89,7 +99,7 @@ module.exports = function(grunt) { More details: [TypeStrong/grunt-ts](https://github.com/TypeStrong/grunt-ts) -# gulp +# Gulp ### Install @@ -115,7 +125,7 @@ gulp.task("default", function () { More details: [ivogabe/gulp-typescript](https://github.com/ivogabe/gulp-typescript) -# jspm +# Jspm ### Install @@ -127,7 +137,7 @@ _Note: Currently TypeScript support in jspm is in 0.16beta_ More details: [TypeScriptSamples/jspm](https://github.com/Microsoft/TypeScriptSamples/tree/master/jspm) -# webpack +# Webpack ### Install From 12c90dbb40fc7e795b641123532ba32ee7b0c342 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 24 Jun 2016 10:51:42 -0700 Subject: [PATCH 052/831] Document this parameters and --noImplicitThis --- pages/Functions.md | 113 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 11 deletions(-) diff --git a/pages/Functions.md b/pages/Functions.md index 7570d2c91..57f91e499 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -215,16 +215,20 @@ function buildName(firstName: string, ...restOfName: string[]) { let buildNameFun: (fname: string, ...rest: string[]) => string = buildName; ``` -# Lambdas and using `this` +# `this` -How `this` works in JavaScript functions is a common theme in programmers coming to JavaScript. -Indeed, learning how to use it is something of a rite of passage as developers become more accustomed to working in JavaScript. +Learning how to use `this` in JavaScript is something of a rite of passage. Since TypeScript is a superset of JavaScript, TypeScript developers also need to learn how to use `this` and how to spot when it's not being used correctly. -A whole article could be written on how to use `this` in JavaScript, and many have. Here, we'll focus on some of the basics. +Fortunately, TypeScript lets you catch incorrect uses of `this` with a couple of techniques. +If you need to learn how `this` works in JavaScript, though, first read Yehuda Katz's [Understanding JavaScript Function Invocation and "this"](http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/). +Yehuda's article explains the inner workings of `this` very well, so we'll just cover the basics here. + + +## `this` and arrow functions In JavaScript, `this` is a variable that's set when a function is called. This makes it a very powerful and flexible feature, but it comes at the cost of always having to know about the context that a function is executing in. -This can be notoriously confusing when, for instance, a function is used as a callback. +This is notoriously confusing, especially when returning a function or passing a function as an argument. Let's look at an example: @@ -248,22 +252,24 @@ let pickedCard = cardPicker(); alert("card: " + pickedCard.card + " of " + pickedCard.suit); ``` +Notice that `createCardPicker` is a function that itself returns a function. If we tried to run the example, we would get an error instead of the expected alert box. This is because the `this` being used in the function created by `createCardPicker` will be set to `window` instead of our `deck` object. -This happens as a result of calling `cardPicker()`. Here, there is no dynamic binding for `this` other than Window. (note: under strict mode, this will be undefined rather than window). +That's because we call `cardPicker()` on its own. +A top-level non-method syntax call like will use `window` for `this`. +(Note: under strict mode, `this` will be `undefined` rather than `window`). We can fix this by making sure the function is bound to the correct `this` before we return the function to be used later. This way, regardless of how it's later used, it will still be able to see the original `deck` object. - -To fix this, we switch the function expression to use the arrow syntax (`() => {}`) rather than the JavaScript function expression. -This will automatically capture the `this` available when the function is created rather than when it is invoked: +To do this, we change the function expression to use the ECMAScript 6 arrow syntax. +Arrow functions capture the `this` where the function is created rather than where it is invoked: ```ts let deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { - // Notice: the line below is now a lambda, allowing us to capture 'this' earlier + // NOTE: the line below is now an arrow function, allowing us to capture 'this' right here return () => { let pickedCard = Math.floor(Math.random() * 52); let pickedSuit = Math.floor(pickedCard / 13); @@ -279,7 +285,92 @@ let pickedCard = cardPicker(); alert("card: " + pickedCard.card + " of " + pickedCard.suit); ``` -For more information on ways to think about `this`, you can read Yehuda Katz's [Understanding JavaScript Function Invocation and "this"](http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/). +Even better, TypeScript will warn you when you make this mistake if you pass the `--noImplicitThis` flag to the compiler. +It will point out that `this` in `this.suits[pickedSuit]` is of type `any`. + +## `this` parameters + +Unfortunately, you will find that TypeScript still says `this` in `this.suits[pickedSuit]` is of type `any` even if you use the arrow function. +That's because TypeScript doesn't know the type of `this` inside a function expression. +To fix this, you can provide an explicit `this` parameter. +`this` parameters are fake parameters that come first in the parameter list of a function: + +```ts +function f(this: void) { + // in strict mode, `this` is undefined for a standalone function, + // represented by the void type here +} +``` + +Let's add a couple of interfaces to our example above, `Card` and `Deck`, to make the types clearer and easier to reuse: + + +```ts +interface Card { + suit: string; + card: number; +} +interface Deck { + suits: string[]; + cards: number[]; + createCardPicker(this: Deck): () => Card; +} +let deck: Deck = { + suits: ["hearts", "spades", "clubs", "diamonds"], + cards: Array(52), + // NOTE: The function now explicitly specifies that its callee must be of type Deck + createCardPicker: function(this: Deck) { + return () => { + let pickedCard = Math.floor(Math.random() * 52); + let pickedSuit = Math.floor(pickedCard / 13); + + return {suit: this.suits[pickedSuit], card: pickedCard % 13}; + } + } +} + +let cardPicker = deck.createCardPicker(); +let pickedCard = cardPicker(); + +alert("card: " + pickedCard.card + " of " + pickedCard.suit); +``` + +Now TypeScript knows that `createCardPicker` expects to be called on a `Deck` object. +That means that `this` is of type `Deck` now, not `any`, so `--noImplicitThis` will not cause any errors. + +### `this` parameters in callbacks + +You can also run into errors with `this` in callbacks, when you pass functions to a library that will later call them. +Because the library that calls your callback will call it like a normal function, `this` will be `undefined`. +With some work you can use `this` to prevent you from making errors in callbacks too. +First, the library author needs to annotate the callback type with `this`: + +```ts +interface UIElement { + addClickListener(onclick: (this: void, e: Event) => void): void; +} +``` + +`this: void` means that `addClickListener` expects `onclick` to be a function that does not require a `this` type. +Second, annotate your code with `this`: + +```ts +class Handlers { + static onClickBad(this: typeof Handlers, e: Event) { + // oops, used this here. using this callback would crash at runtime + this.onClickGood(e); + }; + static onClickGood(this: void, e: Event) { + // can't use this here because it's of type void! + console.log('clicked!'); + } +} +uiElement.addClickListener(Handlers.onClickBad); +uiElement.addClickListener(Handlers.onClickGood); +``` + +Now you will get an error when you try to register `onClickBad` because its `this` is `typeof Handlers`, which `addClickListener` does not accept. +In contrast, because `onClickGood` specifies its `this` type as `void`, it is legal to pass to `addClickListener`. # Overloads From 5a3ef1353e4937b2aff97987877ddd37e3f0e367 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 24 Jun 2016 10:53:50 -0700 Subject: [PATCH 053/831] Fix extra newline lint --- pages/Functions.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/pages/Functions.md b/pages/Functions.md index 57f91e499..c77228072 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -223,7 +223,6 @@ Fortunately, TypeScript lets you catch incorrect uses of `this` with a couple of If you need to learn how `this` works in JavaScript, though, first read Yehuda Katz's [Understanding JavaScript Function Invocation and "this"](http://yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/). Yehuda's article explains the inner workings of `this` very well, so we'll just cover the basics here. - ## `this` and arrow functions In JavaScript, `this` is a variable that's set when a function is called. @@ -304,7 +303,6 @@ function f(this: void) { Let's add a couple of interfaces to our example above, `Card` and `Deck`, to make the types clearer and easier to reuse: - ```ts interface Card { suit: string; From b1e5f80a8958ddcded397e7452961ea4cb0d8697 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 24 Jun 2016 11:36:06 -0700 Subject: [PATCH 054/831] Document UMD module definitions --- pages/Writing Declaration Files.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pages/Writing Declaration Files.md b/pages/Writing Declaration Files.md index d3a75da7a..4d6a1dd59 100644 --- a/pages/Writing Declaration Files.md +++ b/pages/Writing Declaration Files.md @@ -174,6 +174,10 @@ declare var widget: WidgetFactory; ## Global / External-agnostic Libraries +These libraries can be used as either globals or imports. +In a module file (one with any imports/exports), using these as globals is not allowed. +These are also known as [UMD](https://github.com/umdjs/umd) modules. + #### Usage ```ts @@ -187,13 +191,8 @@ zoo.open(); #### Typing ```ts -declare namespace zoo { - function open(): void; -} - -declare module "zoo" { - export = zoo; -} +export function open(): void; +export as namespace zoo; ``` ## Single Complex Object in Modules From c4061f59eb792fa83284c82d2b8f7698993b3b5f Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 24 Jun 2016 14:21:56 -0700 Subject: [PATCH 055/831] Document readonly --- pages/Classes.md | 33 ++++++++++++++------ pages/Interfaces.md | 55 ++++++++++++++++++++++++++++++++++ pages/Variable Declarations.md | 2 ++ 3 files changed, 81 insertions(+), 9 deletions(-) diff --git a/pages/Classes.md b/pages/Classes.md index 942829ab3..25d0027fd 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -216,27 +216,42 @@ let howard = new Employee("Howard", "Sales"); let john = new Person("John"); // Error: The 'Person' constructor is protected ``` +# Readonly modifier + +You can make properties readonly by using the `readonly` keyword. +Readonly properties must be initialized at their declaration or in the constructor. + +```ts +class Octopus { + readonly name: string; + readonly numberOfLegs: number = 8; + constructor (theName: string) { + this.name = theName; + } +} +let dad = new Octopus("Man with the 8 strong legs"); +dad.name = "Man with the 3-piece suit"; // error! name is readonly. +``` ## Parameter properties -In our last example, we had to declare a protected member `name` and a constructor parameter `theName` in the `Person` class, and we then immediately set `name` to `theName`. +In our last example, we had to declare a readonly member `name` and a constructor parameter `theName` in the `Octopus` class, and we then immediately set `name` to `theName`. This turns out to be a very common practice. *Parameter properties* let you create and initialize a member in one place. -Here's a further revision of the previous `Animal` class using a parameter property: +Here's a further revision of the previous `Animal` and `Octopus` classes using a parameter property: ```ts -class Animal { - constructor(private name: string) { } - move(distanceInMeters: number) { - console.log(`${this.name} moved ${distanceInMeters}m.`); +class Octopus { + readonly numberOfLegs: number = 8; + constructor(readonly name: string) { } } ``` -Notice how we dropped `theName` altogether and just use the shortened `private name: string` parameter on the constructor to create and initialize the `name` member. +Notice how we dropped `theName` altogether and just use the shortened `readonly name: string` parameter on the constructor to create and initialize the `name` member. We've consolidated the declarations and assignment into one location. -Parameter properties are declared by prefixing a constructor parameter with an accessibility modifier. -Using `private` for a parameter property declares and initializes a private member; likewise, the same is done for `public` and `protected`. +Parameter properties are declared by prefixing a constructor parameter with an accessibility modifier or `readonly`, or both. +Using `private` for a parameter property declares and initializes a private member; likewise, the same is done for `public`, `protected`, and `readonly`. # Accessors diff --git a/pages/Interfaces.md b/pages/Interfaces.md index 12610e672..793a46862 100644 --- a/pages/Interfaces.md +++ b/pages/Interfaces.md @@ -98,6 +98,49 @@ function createSquare(config: SquareConfig): { color: string; area: number } { let mySquare = createSquare({color: "black"}); ``` +# Readonly properties + +Some properties should only be modifiable when an object is first created. +You can specify this by putting `readonly` before the name of the property: + +```ts +interface Point { + readonly x: number; + readonly y: number; +} +``` + +You can construct a `Point` by assigning an object literal. +After the assignment, `x` and `y` can't be changed. + +```ts +let p1: Point = { x: 10, y: 20 }; +p1.x = 5; // error! +``` + +TypeScript comes with a `ReadonlyArray` type that is the same as `Array` with all mutating methods removed, so you can make sure you don't change your arrays after creation: + +```ts +let a: number[] = [1, 2, 3, 4]; +let ro: ReadonlyArray = a; +ro[0] = 12; // error! +ro.push(5); // error! +ro.length = 100; // error! +a = ro; // error! +``` + +On the last line of the snippet you can see that even assigning the entire `ReadonlyArray` back to a normal array is illegal. +You can still override it with a type assertion, though: + +```ts +a = ro as number[]; +``` + +## `readonly` vs `const` + +The easiest way to remember whether to use readonly or const is to ask whether you're using it on a variable or a property. +Variables use `const` whereas properties use `readonly`. + # Excess Property Checks In our first example using interfaces, TypeScript let us pass `{ size: number; label: string; }` to something that only expected a `{ label: string; }`. @@ -282,6 +325,18 @@ interface NumberDictionary { } ``` +Finally, you can make index signatures readonly in order to prevent assignment to their indices: + +```ts +interface ReadonlyStringArray { + readonly [index: number]: string; +} +let myArray: ReadonlyStringArray = ["Alice", "Bob"]; +myArray[2] = "Mallory"; // error! +``` + +You can't set `myArray[2]` because the index signature is readonly. + # Class Types ## Implementing an interface diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index aa3f63895..8f3c2bc81 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -417,6 +417,8 @@ kitty.numLives--; ``` Unless you take specific measures to avoid it, the internal state of a `const` variable is still modifiable. +Fortunately, TypeScript allows you to specify that members of an object are `readonly`. +The [chapter on Interfaces](./Interfaces.md) has the details. # `let` vs. `const` From 8e13006e28ab71aa20dea925d7a65fb76c275cc9 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 24 Jun 2016 14:24:29 -0700 Subject: [PATCH 056/831] Minor fix to parameter properties update --- pages/Classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Classes.md b/pages/Classes.md index 25d0027fd..b8a1ca8c3 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -237,7 +237,7 @@ dad.name = "Man with the 3-piece suit"; // error! name is readonly. In our last example, we had to declare a readonly member `name` and a constructor parameter `theName` in the `Octopus` class, and we then immediately set `name` to `theName`. This turns out to be a very common practice. *Parameter properties* let you create and initialize a member in one place. -Here's a further revision of the previous `Animal` and `Octopus` classes using a parameter property: +Here's a further revision of the previous `Octopus` class using a parameter property: ```ts class Octopus { From c9dda1c4b13b3f0c45f8925d54035e6de40ca820 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 24 Jun 2016 16:11:48 -0700 Subject: [PATCH 057/831] Fix missing newline lint --- pages/Classes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/Classes.md b/pages/Classes.md index b8a1ca8c3..40ff42560 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -232,6 +232,7 @@ class Octopus { let dad = new Octopus("Man with the 8 strong legs"); dad.name = "Man with the 3-piece suit"; // error! name is readonly. ``` + ## Parameter properties In our last example, we had to declare a readonly member `name` and a constructor parameter `theName` in the `Octopus` class, and we then immediately set `name` to `theName`. From 56eb6534acaa7fdb0db7a04621a7b1a12c1a057b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 24 Jun 2016 16:14:53 -0700 Subject: [PATCH 058/831] Remove `(default)` marker from classic module loader --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index a815b3e20..c7cba7d9d 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -27,7 +27,7 @@ Option | Type | Default `--locale` | `string` | *(platform specific)* | The locale to use to show error messages, e.g. en-us. `--mapRoot` | `string` | `null` | Specifies the location where debugger should locate map files instead of generated locations. Use this flag if the .map files will be located at run-time in a different location than than the .js files. The location specified will be embedded in the sourceMap to direct the debugger where the map files where be located. `--module`
`-m` | `string` | `(target === "ES6" ? "ES6" : "CommonJS")` | Specify module code generation: `'none'`, `'commonjs'`, `'amd'`, `'system'`, `'umd'`, `'es6'`, or `'es2015'`.
► Only `'amd'` and `'system'` can be used in conjunction with `--outFile`.
► `'es6'` and `'es2015'` values may not be used when targeting ES5 or lower. -`--moduleResolution` | `string` | `"Classic"` | Determine how modules get resolved. Either `'node'` for Node.js/io.js style resolution, or `'classic'` (default). See [Module Resolution documentation](Module Resolution.md) for more details. +`--moduleResolution` | `string` | `"Classic"` | Determine how modules get resolved. Either `'node'` for Node.js/io.js style resolution, or `'classic'`. See [Module Resolution documentation](Module Resolution.md) for more details. `--newLine` | `string` | *(platform specific)* | Use the specified end of line sequence to be used when emitting files: `'crlf'` (windows) or `'lf'` (unix)." `--noEmit` | `boolean` | `false` | Do not emit outputs. `--noEmitHelpers` | `boolean` | `false` | Do not generate custom helper functions like `__extends` in compiled output. From 301cce0c039ef3bf78e6ebc3560539389fb249ab Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 24 Jun 2016 16:15:51 -0700 Subject: [PATCH 059/831] Note that get/no-set accessors are readonly --- pages/Classes.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pages/Classes.md b/pages/Classes.md index 40ff42560..2b508d010 100644 --- a/pages/Classes.md +++ b/pages/Classes.md @@ -309,7 +309,12 @@ if (employee.fullName) { To prove to ourselves that our accessor is now checking the passcode, we can modify the passcode and see that when it doesn't match we instead get the message warning us we don't have access to update the employee. -Note: Accessors require you to set the compiler to output ECMAScript 5 or higher. +A couple of things to note about accessors: + +First, accessors require you to set the compiler to output ECMAScript 5 or higher. +Downlevelling to ECMAScript 3 is not supported. +Second, accessors with a `get` and no `set` are automatically inferred to be `readonly`. +This is helpful when generating a `.d.ts` file from your code, because users of your property can see that they can't change it. # Static Properties From 97bf83cdcc430950bfd5036b04d62832b528bf5d Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 27 Jun 2016 08:36:41 -0700 Subject: [PATCH 060/831] Improve wording and expand examples --- pages/Functions.md | 51 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/pages/Functions.md b/pages/Functions.md index c77228072..aa5c669c1 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -289,15 +289,14 @@ It will point out that `this` in `this.suits[pickedSuit]` is of type `any`. ## `this` parameters -Unfortunately, you will find that TypeScript still says `this` in `this.suits[pickedSuit]` is of type `any` even if you use the arrow function. +Unfortunately, by default TypeScript will still type `this` in `this.suits[pickedSuit]` as `any`. That's because TypeScript doesn't know the type of `this` inside a function expression. To fix this, you can provide an explicit `this` parameter. `this` parameters are fake parameters that come first in the parameter list of a function: ```ts function f(this: void) { - // in strict mode, `this` is undefined for a standalone function, - // represented by the void type here + // make sure `this` is unusable in this standalone function } ``` @@ -340,7 +339,7 @@ That means that `this` is of type `Deck` now, not `any`, so `--noImplicitThis` w You can also run into errors with `this` in callbacks, when you pass functions to a library that will later call them. Because the library that calls your callback will call it like a normal function, `this` will be `undefined`. -With some work you can use `this` to prevent you from making errors in callbacks too. +With some work you can use `this` parameters to prevent errors with callbacks too. First, the library author needs to annotate the callback type with `this`: ```ts @@ -350,25 +349,51 @@ interface UIElement { ``` `this: void` means that `addClickListener` expects `onclick` to be a function that does not require a `this` type. -Second, annotate your code with `this`: +Second, annotate your calling code with `this`: ```ts -class Handlers { - static onClickBad(this: typeof Handlers, e: Event) { +class Handler { + info: string; + onClickBad(this: Handler, e: Event) { // oops, used this here. using this callback would crash at runtime - this.onClickGood(e); + this.info = e.message; }; - static onClickGood(this: void, e: Event) { +} +let h = new Handler(); +uiElement.addClickListener(h.onClickBad); // error! +``` + +With `this` annotated, you make it explicit that `onClickBad` must be called on an instance of `Handler`. +Then TypeScript will detect that `addClickListener` requires a function that has `this: void`. +To fix the error, change the type of `this`: + +```ts +class Handler { + info: string; + onClickGood(this: void, e: Event) { // can't use this here because it's of type void! console.log('clicked!'); } } -uiElement.addClickListener(Handlers.onClickBad); -uiElement.addClickListener(Handlers.onClickGood); +let h = new Handler(); +uiElement.addClickListener(h.onClickGood); +``` + +Because `onClickGood` specifies its `this` type as `void`, it is legal to pass to `addClickListener`. +Of course, this also means that it can't use `this.info`. +If you want both then you'll have to use an arrow function: + +```ts +class Handler { + info: string; + onClickGood = (e: Event) => { this.info = e.message } +} ``` -Now you will get an error when you try to register `onClickBad` because its `this` is `typeof Handlers`, which `addClickListener` does not accept. -In contrast, because `onClickGood` specifies its `this` type as `void`, it is legal to pass to `addClickListener`. +This works because arrow functions don't capture `this`, so you can always pass them to something that expects `this: void`. +The downside is that one arrow function is created per object of type Handler. +Methods, on the other hand, are only created once and attached to Handler's prototype. +They are shared between all objects of type Handler. # Overloads From 4e03c8c3722d65a94fabca460a332cea89f97167 Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Fri, 24 Jun 2016 18:11:15 -0700 Subject: [PATCH 061/831] Documentation for using globs in tsconfig.json --- pages/tsconfig.json.md | 91 ++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 56 deletions(-) diff --git a/pages/tsconfig.json.md b/pages/tsconfig.json.md index 937facc68..de98d232f 100644 --- a/pages/tsconfig.json.md +++ b/pages/tsconfig.json.md @@ -13,72 +13,51 @@ When input files are specified on the command line, `tsconfig.json` files are ig ## Examples -Example `tsconfig.json` files: - -* Using the `"files"` property - - ```json - { - "compilerOptions": { - "module": "commonjs", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "outFile": "../../built/local/tsc.js", - "sourceMap": true - }, - "files": [ - "core.ts", - "sys.ts", - "types.ts", - "scanner.ts", - "parser.ts", - "utilities.ts", - "binder.ts", - "checker.ts", - "emitter.ts", - "program.ts", - "commandLineParser.ts", - "tsc.ts", - "diagnosticInformationMap.generated.ts" - ] - } - ``` - -* Using the `"exclude"` property - - ```json - { - "compilerOptions": { - "module": "commonjs", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "outFile": "../../built/local/tsc.js", - "sourceMap": true - }, - "exclude": [ - "node_modules", - "wwwroot" - ] - } - ``` +Example `tsconfig.json` file: + +```json +{ + "compilerOptions": { + "module": "commonjs", + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "outFile": "../../built/local/tsc.js", + "sourceMap": true + }, + "files": [ + "main.ts" + ], + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "**/*.spec.ts" + ], +} +``` ## Details The `"compilerOptions"` property can be omitted, in which case the compiler's defaults are used. See our full list of supported [Compiler Options](./Compiler Options.md). -If no `"files"` property is present in a `tsconfig.json`, the compiler defaults to including all TypeScript (`*.ts` or `*.tsx`) files in the containing directory and subdirectories. -When a `"files"` property is present, only the specified files are included. +The `"files"` property takes a list of relative or absolute file paths. The `"include"` and `"exclude"` properties take a list of glob-like file patterns. The supported glob wildcards are: + +* `*` matches zero or more characters (excluding directory separators) +* `?` matches any one character (excluding directory separators) +* `**/` recursively matches any subdirectory + +If a segment of a glob pattern includes only `*` or `.*`, then only files with supported extensions are included (e.g. `.ts`, `.tsx`, and `.d.ts` by default with `.js` and `.jsx` if `allowJs` is set to true). -If the `"exclude"` property is specified, the compiler includes all TypeScript (`*.ts` or `*.tsx`) files in the containing directory and subdirectories except for those files or folders that are excluded. +If the `"files"` and `"include"` are both left unspecified, the compiler defaults to including all TypeScript (`.ts`, `.d.ts` and `.tsx`) files in the containing directory and subdirectories except those excluded using the `"exclude"` property. JS files (`.js` and `.jsx`) are also included if `allowJs` is set to true. If the `"files"` or `"include"` properties are specified, the compiler will instead include the union of the files included by those two properties. Files in the directory specified using the `"outDir"` compiler option are always excluded unless explicitly included via the `"files"` property (even when the "`exclude`" property is specified). -The `"files"` property cannot be used in conjunction with the `"exclude"` property. If both are specified then the `"files"` property takes precedence. +Files included using `"include"` can be filtered using the `"exclude"` property. However, files included explicitly using the `"files"` property are always included regardless of `"exclude"`. The `"exclude"` property defaults to excluding the `node_modules`, `bower_components`, and `jspm_packages` directories when not specified. -Any files that are referenced by those specified in the `"files"` property are also included. +Any files that are referenced by files included via the `"files"` or `"include"` properties are also included. Similarly, if a file `B.ts` is referenced by another file `A.ts`, then `B.ts` cannot be excluded unless the referencing file `A.ts` is also specified in the `"exclude"` list. -A `tsconfig.json` file is permitted to be completely empty, which compiles all files in the containing directory and subdirectories with the default compiler options. +A `tsconfig.json` file is permitted to be completely empty, which compiles all files included by default (as described above) with the default compiler options. Compiler options specified on the command line override those specified in the `tsconfig.json` file. From c10ef0279f508883811b5fc495cc9743d487e4fb Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Mon, 27 Jun 2016 10:10:17 -0700 Subject: [PATCH 062/831] One sentence per line --- pages/tsconfig.json.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pages/tsconfig.json.md b/pages/tsconfig.json.md index de98d232f..e1aea9b6a 100644 --- a/pages/tsconfig.json.md +++ b/pages/tsconfig.json.md @@ -42,7 +42,9 @@ Example `tsconfig.json` file: The `"compilerOptions"` property can be omitted, in which case the compiler's defaults are used. See our full list of supported [Compiler Options](./Compiler Options.md). -The `"files"` property takes a list of relative or absolute file paths. The `"include"` and `"exclude"` properties take a list of glob-like file patterns. The supported glob wildcards are: +The `"files"` property takes a list of relative or absolute file paths. +The `"include"` and `"exclude"` properties take a list of glob-like file patterns. +The supported glob wildcards are: * `*` matches zero or more characters (excluding directory separators) * `?` matches any one character (excluding directory separators) @@ -50,9 +52,13 @@ The `"files"` property takes a list of relative or absolute file paths. The `"in If a segment of a glob pattern includes only `*` or `.*`, then only files with supported extensions are included (e.g. `.ts`, `.tsx`, and `.d.ts` by default with `.js` and `.jsx` if `allowJs` is set to true). -If the `"files"` and `"include"` are both left unspecified, the compiler defaults to including all TypeScript (`.ts`, `.d.ts` and `.tsx`) files in the containing directory and subdirectories except those excluded using the `"exclude"` property. JS files (`.js` and `.jsx`) are also included if `allowJs` is set to true. If the `"files"` or `"include"` properties are specified, the compiler will instead include the union of the files included by those two properties. Files in the directory specified using the `"outDir"` compiler option are always excluded unless explicitly included via the `"files"` property (even when the "`exclude`" property is specified). +If the `"files"` and `"include"` are both left unspecified, the compiler defaults to including all TypeScript (`.ts`, `.d.ts` and `.tsx`) files in the containing directory and subdirectories except those excluded using the `"exclude"` property. JS files (`.js` and `.jsx`) are also included if `allowJs` is set to true. +If the `"files"` or `"include"` properties are specified, the compiler will instead include the union of the files included by those two properties. +Files in the directory specified using the `"outDir"` compiler option are always excluded unless explicitly included via the `"files"` property (even when the "`exclude`" property is specified). -Files included using `"include"` can be filtered using the `"exclude"` property. However, files included explicitly using the `"files"` property are always included regardless of `"exclude"`. The `"exclude"` property defaults to excluding the `node_modules`, `bower_components`, and `jspm_packages` directories when not specified. +Files included using `"include"` can be filtered using the `"exclude"` property. +However, files included explicitly using the `"files"` property are always included regardless of `"exclude"`. +The `"exclude"` property defaults to excluding the `node_modules`, `bower_components`, and `jspm_packages` directories when not specified. Any files that are referenced by files included via the `"files"` or `"include"` properties are also included. Similarly, if a file `B.ts` is referenced by another file `A.ts`, then `B.ts` cannot be excluded unless the referencing file `A.ts` is also specified in the `"exclude"` list. From d5078fcbfa4350a4f142d339773b52e10dda00c2 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 27 Jun 2016 10:29:59 -0700 Subject: [PATCH 063/831] Improve wording of this-parameter intro --- pages/Functions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Functions.md b/pages/Functions.md index aa5c669c1..c5d8a08c2 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -289,8 +289,8 @@ It will point out that `this` in `this.suits[pickedSuit]` is of type `any`. ## `this` parameters -Unfortunately, by default TypeScript will still type `this` in `this.suits[pickedSuit]` as `any`. -That's because TypeScript doesn't know the type of `this` inside a function expression. +Unfortunately, the type of `this.suits[pickedSuit]` is still `any`. +That's because `this` comes from the function expression inside the object literal. To fix this, you can provide an explicit `this` parameter. `this` parameters are fake parameters that come first in the parameter list of a function: From d0a9bb20b36395b8fc6d012bbbbc419bfbcc3d1c Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 27 Jun 2016 10:44:02 -0700 Subject: [PATCH 064/831] Add description of UMD modules to `Modules.md` in addition to `Writing Declaration Files.md` --- pages/Modules.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pages/Modules.md b/pages/Modules.md index 91524cd7b..8dae94f4c 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -517,6 +517,31 @@ import x, {y} from "hot-new-module"; x(y); ``` +### UMD modules + +Some libraries can be used either through imports or through globals. + +##### math-lib.d.ts + +```ts +export const isPrime(x: number): boolean;' +export as namespace mathLib; +``` + +The library can then be used as an import within modules: + +```ts +import { isPrime } from "math-lib"; +isPrime(2); +mathLib.isPrime(2); // ERROR: can't use the global definition from inside a module +``` + +It can also be used as a global variable, but only inside of a script: + +```ts +mathLib.isPrime(2); +``` + # Guidance for structuring modules ## Export as close to top-level as possible From 939650d392f389090b663bc5117234cfda5d4812 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 27 Jun 2016 10:56:59 -0700 Subject: [PATCH 065/831] Document discriminated unions Also move intersection types together with union types. Also some minor fixups. Squashed commit of the following: commit a86ccc5d9170c7581a7cf63c8d60301ea450b96f Merge: 620350d 819891d Author: Nathan Shively-Sanders Date: Mon Jun 27 10:56:02 2016 -0700 Merge branch 'release-2.0' into discriminated-unions-WIP commit 620350dcfc0fe0be8bed7dd6894f7436e45dc059 Author: Nathan Shively-Sanders Date: Mon Jun 27 10:49:47 2016 -0700 Finish exhaustiveness checking commit e5fabc82df929a04cf0f695d8f5f7aead19106b3 Author: Nathan Shively-Sanders Date: Mon Jun 27 10:04:01 2016 -0700 Mostly done commit 572e93a1a9bc956011e12add5c60c18de1712b57 Author: Nathan Shively-Sanders Date: Mon Jun 27 09:31:56 2016 -0700 One new example and minor wording tweaks commit 87f684499ce7c72a1d2067dd90f2889ecd164ea3 Author: Nathan Shively-Sanders Date: Fri Jun 24 16:09:49 2016 -0700 Preparatory reorganisation 1. Move intersection types to the beginning. 2. Improve wording a little. --- pages/Advanced Types.md | 206 ++++++++++++++++++++++++++++++++-------- 1 file changed, 164 insertions(+), 42 deletions(-) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 0463bf97b..14387168d 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -1,5 +1,47 @@ +# Intersection Types + +An intersection type combines multiple types into one. +This allows you to add together existing types to get a single type that has all the features you need. +For example, `Person & Serializable & Loggable` is a `Person` *and* `Serializable` *and* `Loggable`. +That means an object of this type will have all members of all three types. + +You will mostly see intersection types used for mixins and other concepts that don't fit in the classic object-oriented mold. +(There are a lot of these in JavaScript!) +Here's a simple example that shows how to create a mixin: + +```ts +function extend(first: T, second: U): T & U { + let result = {}; + for (let id in first) { + (result)[id] = (first)[id]; + } + for (let id in second) { + if (!result.hasOwnProperty(id)) { + (result)[id] = (second)[id]; + } + } + return result; +} + +class Person { + constructor(public name: string) { } +} +interface Loggable { + log(): void; +} +class ConsoleLogger implements Loggable { + log() { + // ... + } +} +var jim = extend(new Person("Jim"), new ConsoleLogger()); +var n = jim.name; +jim.log(); +``` + # Union Types +Union types are closely related to intersection types, but they are used very differently. Occasionally, you'll run into a library that expects a parameter to be either a `number` or a `string`. For instance, take the following function: @@ -32,7 +74,7 @@ let indentedString = padLeft("Hello world", true); // passes at compile time, fa In traditional object-oriented code, we might abstract over the two types by creating a hierarchy of types. While this is much more explicit, it's also a little bit overkill. One of the nice things about the original version of `padLeft` was that we were able to just pass in primitives. -That meant that usage was simple and not overly verbose. +That meant that usage was simple and concise. This new approach also wouldn't help if we were just trying to use a function that already exists elsewhere. Instead of `any`, we can use a *union type* for the `padding` parameter: @@ -149,7 +191,7 @@ it also knows that in the `else` branch, you *don't* have a `Fish`, so you must ## `typeof` type guards -We didn't actually discuss the implementation of the version of `padLeft` which used union types. +Let's go back and write the code for the version of `padLeft` that uses union types. We could write it with type predicates as follows: ```ts @@ -189,7 +231,7 @@ function padLeft(value: string, padding: string | number) { ``` These *`typeof` type guards* are recognized in two different forms: `typeof v === "typename"` and `typeof v !== "typename"`, where `"typename"` must be `"number"`, `"string"`, `"boolean"`, or `"symbol"`. -While TypeScript won't prohibit comparing to other strings, or switching the two sides of the comparison, the language won't recognize those forms as type guards. +While TypeScript won't stop you from comparing to other strings, the language won't recognize those expressions as type guards. ## `instanceof` type guards @@ -241,44 +283,6 @@ The right side of the `instanceof` needs to be a constructor function, and TypeS in that order. -# Intersection Types - -Intersection types are closely related to union types, but they are used very differently. -An intersection type, `Person & Serializable & Loggable`, for example, is a `Person` *and* `Serializable` *and* `Loggable`. -That means an object of this type will have all members of all three types. -In practice you will mostly see intersection types used for mixins. -Here's a simple mixin example: - -```ts -function extend(first: T, second: U): T & U { - let result = {}; - for (let id in first) { - (result)[id] = (first)[id]; - } - for (let id in second) { - if (!result.hasOwnProperty(id)) { - (result)[id] = (second)[id]; - } - } - return result; -} - -class Person { - constructor(public name: string) { } -} -interface Loggable { - log(): void; -} -class ConsoleLogger implements Loggable { - log() { - // ... - } -} -var jim = extend(new Person("Jim"), new ConsoleLogger()); -var n = jim.name; -jim.log(); -``` - # Type Aliases Type aliases create a new name for a type. @@ -343,7 +347,20 @@ type Yikes = Array; // error As we mentioned, type aliases can act sort of like interfaces; however, there are some subtle differences. -One important difference is that type aliases cannot be extended or implemented from (nor can they extend/implement other types). +One difference is that interfaces create a new name that is used everywhere. +Type aliases don't create a new name -- intellisense doesn't show the alias name, for example. +In the code below, intellisense will show that `interfaced` requires and returns an `Interface`, but `aliased` will show object literal types. + +```ts +type Alias = { num: number } +interface Interface { + num: number; +} +declare function aliased(arg: Alias): Alias; +declare function interfaced(arg: Interface): Interface; +``` + +A second, more important difference is that type aliases cannot be extended or implemented from (nor can they extend/implement other types). Because [an ideal property of software is being open to extension](https://en.wikipedia.org/wiki/Open/closed_principle), you should always use an interface over a type alias if possible. On the other hand, if you can't express some shape with an interface and you need to use a union or tuple type, type aliases are usually the way to go. @@ -393,6 +410,111 @@ function createElement(tagName: string): Element { } ``` +# Discriminated Unions + +You can combine string literal types, union types, type guards and type aliases to build an advanced pattern called *discriminated unions*. +Discriminated unions are useful in functional programming. +TypeScript doesn't have built-in support for this pattern, but you can get the compiler to check it once you have it set up. +There are four ingredients: + +1. Interfaces with a common property of a string-literal type +2. A type alias that unions the interfaces +3. Type guards on the common property +4. Exhaustiveness checking (optional) + +```ts +interface Square { + kind: "square"; + size: number; +} +interface Rectangle { + kind: "rectangle"; + width: number; + height: number; +} +interface Circle { + kind: "circle"; + radius: number; +} +``` + +First we declare the interfaces we will union. +Each interface has a `kind` property with a different string literal type. +The `kind` property is called the *discriminant* or *tag*. +The other properties are the important parts of each interface. +Notice that the interfaces are currently unrelated. +Let's put them into a union: + +```ts +type Shape = Square | Rectangle | Circle; +``` + +Now let's use the discriminated union: + +```ts +function area(s: Shape) { + switch(s.kind) { + case "square": return s.size * s.size; + case "rectangle": return s.height * s.width; + case "circle": return Math.PI * s.radius * s.radius; + } +} +``` + +## Exhaustiveness checking + +We would like the compiler to tell us when we don't cover all variants of the discriminated union. +For example, if we add `Triangle` to `Shape`, we need to update `area` as well: + +```ts +type Shape = Square | Rectangle | Circle | Triangle; +function area(s: Shape) { + switch(s.kind) { + case "square": return s.size * s.size; + case "rectangle": return s.height * s.width; + case "circle": return Math.PI * s.radius * s.radius; + } + // should error here -- we didn't handle case "triangle" +} +``` + +There are two ways to do this. +The first is to turn on `--strictNullChecks` and specify a return type: + +```ts +function area(s: Shape): number { // error: returns number | undefined + switch(s.kind) { + case "square": return s.size * s.size; + case "rectangle": return s.height * s.width; + case "circle": return Math.PI * s.radius * s.radius; + } +} +``` + +Because the `switch` is no longer exhaustive, TypeScript is aware that the function could sometimes return `undefined`. +If you have an explicit return type `number`, then you will get an error that the return type is actually `number | undefined`. +However, this method is quite subtle and, besides, `--strictNullChecks` does not always work with old code. + +The second method uses the `never` type that the compiler uses to check for exhaustiveness: + +```ts +function assertNever(x: never): never { + throw new Error("Unexpected object: " + x); +} +function area(s: Shape) { + switch(s.kind) { + case "square": return s.size * s.size; + case "rectangle": return s.height * s.width; + case "circle": return Math.PI * s.radius * s.radius; + default: return assertNever(s); // error here if there are missing cases + } +} +``` + +Here, `assertNever` checks that `s` is of type `never` -- the type that's left after all other cases have been removed. +If you forget a case, then `s` will have a real type and you will get a type error. +This method requires you to define an extra function, but it's much more obvious when you forget it. + # Polymorphic `this` types A polymorphic `this` type represents a type that is the *subtype* of the containing class or interface. From a574809832ec321d902294e3eeb698f68782f22b Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 27 Jun 2016 11:06:57 -0700 Subject: [PATCH 066/831] Elaborate --- pages/Modules.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pages/Modules.md b/pages/Modules.md index 8dae94f4c..d049a5a53 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -519,7 +519,10 @@ x(y); ### UMD modules -Some libraries can be used either through imports or through globals. +Some libraries are designed to be used in many module loaders, or with no module loading (global variables). +These are known as [UMD](https://github.com/umdjs/umd) or [Isomorphic](http://isomorphic.net) modules. +These libraries can be accessed through either an import or a global variable. +For example: ##### math-lib.d.ts @@ -536,7 +539,8 @@ isPrime(2); mathLib.isPrime(2); // ERROR: can't use the global definition from inside a module ``` -It can also be used as a global variable, but only inside of a script: +It can also be used as a global variable, but only inside of a script. +(A script is a file with no imports or exports.) ```ts mathLib.isPrime(2); From c2d901d6dc5b5eead20ef97dc16688bf3f620af6 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 27 Jun 2016 11:38:58 -0700 Subject: [PATCH 067/831] Move discussion of wildcard modules to Modules.md --- pages/Module Resolution.md | 27 --------------------------- pages/Modules.md | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 7bfd61c9e..105b762b1 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -42,33 +42,6 @@ A non-relative import can be resolved relative to `baseUrl`, or through path map They can also resolve to [ambient module declarations](./Modules.md#ambient-modules). Use non-relative paths when importing any of your external dependnecies. -## Wildcard module declarations - -Some module loaders such as [SystemJS](https://github.com/systemjs/systemjs/blob/master/docs/overview.md#plugin-syntax) -and [AMD](https://github.com/amdjs/amdjs-api/blob/master/LoaderPlugins.md) allow non-JavaScript content to be imported. -These typically use a prefix or suffix to indicate the special loading semantics. -Wildcard module declarations can be used to cover these cases. - -```ts -declare module "*!text" { - const content: string; - export default content; -} -// Some do it the other way around. -declare module "json!*" { - const value: any; - export default value; -} -``` - -Now you can import things that match `"*!text"` or `"json!*"`. - -```ts -import fileContent from "./xyz.txt!text"; -import data from "json!http://example.com/data.json"; -console.log(data, fileContent); -``` - ## Module Resolution Strategies There are two possible module resolution strategies: [Node](#node) and [Classic](#classic). diff --git a/pages/Modules.md b/pages/Modules.md index d049a5a53..f84edcda8 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -517,6 +517,33 @@ import x, {y} from "hot-new-module"; x(y); ``` +### Wildcard module declarations + +Some module loaders such as [SystemJS](https://github.com/systemjs/systemjs/blob/master/docs/overview.md#plugin-syntax) +and [AMD](https://github.com/amdjs/amdjs-api/blob/master/LoaderPlugins.md) allow non-JavaScript content to be imported. +These typically use a prefix or suffix to indicate the special loading semantics. +Wildcard module declarations can be used to cover these cases. + +```ts +declare module "*!text" { + const content: string; + export default content; +} +// Some do it the other way around. +declare module "json!*" { + const value: any; + export default value; +} +``` + +Now you can import things that match `"*!text"` or `"json!*"`. + +```ts +import fileContent from "./xyz.txt!text"; +import data from "json!http://example.com/data.json"; +console.log(data, fileContent); +``` + ### UMD modules Some libraries are designed to be used in many module loaders, or with no module loading (global variables). From 9a91c549e019eb0e57d14f740f4cc49c4a274d7a Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Mon, 27 Jun 2016 13:17:50 -0700 Subject: [PATCH 068/831] Restoring separate example for files --- pages/tsconfig.json.md | 77 +++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 24 deletions(-) diff --git a/pages/tsconfig.json.md b/pages/tsconfig.json.md index e1aea9b6a..544c51957 100644 --- a/pages/tsconfig.json.md +++ b/pages/tsconfig.json.md @@ -13,30 +13,59 @@ When input files are specified on the command line, `tsconfig.json` files are ig ## Examples -Example `tsconfig.json` file: - -```json -{ - "compilerOptions": { - "module": "commonjs", - "noImplicitAny": true, - "removeComments": true, - "preserveConstEnums": true, - "outFile": "../../built/local/tsc.js", - "sourceMap": true - }, - "files": [ - "main.ts" - ], - "include": [ - "src/**/*" - ], - "exclude": [ - "node_modules", - "**/*.spec.ts" - ], -} -``` +Example `tsconfig.json` files: + +* Using the `"files"` property + + ```json + { + "compilerOptions": { + "module": "commonjs", + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "outFile": "../../built/local/tsc.js", + "sourceMap": true + }, + "files": [ + "core.ts", + "sys.ts", + "types.ts", + "scanner.ts", + "parser.ts", + "utilities.ts", + "binder.ts", + "checker.ts", + "emitter.ts", + "program.ts", + "commandLineParser.ts", + "tsc.ts", + "diagnosticInformationMap.generated.ts" + ] + } + ``` + +* Using the `"include"` and `"exclude"` properties + + ```json + { + "compilerOptions": { + "module": "commonjs", + "noImplicitAny": true, + "removeComments": true, + "preserveConstEnums": true, + "outFile": "../../built/local/tsc.js", + "sourceMap": true + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "**/*.spec.ts" + ], + } + ``` ## Details From eb13e0042b217f2b5d9b755f7d36d016dbc9d8cf Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Mon, 27 Jun 2016 14:02:22 -0700 Subject: [PATCH 069/831] Add noUnusedLocals and noUnusedParameter --- pages/Compiler Options.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index c7cba7d9d..5bb5e1fa3 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -9,8 +9,9 @@ Option | Type | Default `--baseUrl` | `string` | | Base directory to resolve non-relative module names. See [Module Resolution documentation](./Module Resolution.md#base-url) for more details. `--charset` | `string` | `"utf8"` | The character set of the input files. `--declaration`
`-d` | `boolean` | `false` | Generates corresponding '.d.ts' file. -`--declarationDir` | `string` | | Output directory for generated declaration files. +`--declarationDir` | `string` | `null` | Output directory for generated declaration files. `--diagnostics` | `boolean` | `false` | Show diagnostic information. +`--disableSizeLimit` | `boolean` | `false` | Disable size limitation on JavaScript project. `--emitBOM` | `boolean` | `false` | Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. `--emitDecoratorMetadata`[1] | `boolean` | `false` | Emit design-type metadata for decorated declarations in source. See [issue #2577](https://github.com/Microsoft/TypeScript/issues/2577) for details. `--experimentalDecorators`[1] | `boolean` | `false` | Enables experimental support for ES7 decorators. @@ -39,6 +40,8 @@ Option | Type | Default `--noImplicitUseStrict` | `boolean` | `false` | Do not emit `"use strict"` directives in module output. `--noLib` | `boolean` | `false` | Do not include the default library file (lib.d.ts). `--noResolve` | `boolean` | `false` | Do not add triple-slash references or module import targets to the list of compiled files. +`--noUnusedLocals` | `boolean` | `false` | Report errors on unused locals. +`--noUnusedParameters` | `boolean` | `false` | Report errors on unused parameters. ~~`--out`~~ | `string` | `null` | DEPRECATED. Use `--outFile` instead. `--outDir` | `string` | `null` | Redirect output structure to the directory. `--outFile` | `string` | `null` | Concatenate and emit output to single file. The order of concatenation is determined by the list of files passed to the compiler on the command line along with triple-slash references and imports. See output file order documentation for more details. From 47cd655ae536df62188bcc9a407c8521ca9ba5ed Mon Sep 17 00:00:00 2001 From: Richard Knoll Date: Mon, 27 Jun 2016 14:57:22 -0700 Subject: [PATCH 070/831] Removing extra comma --- pages/tsconfig.json.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tsconfig.json.md b/pages/tsconfig.json.md index 544c51957..2130e83af 100644 --- a/pages/tsconfig.json.md +++ b/pages/tsconfig.json.md @@ -63,7 +63,7 @@ Example `tsconfig.json` files: "exclude": [ "node_modules", "**/*.spec.ts" - ], + ] } ``` From 2ec4e1c7598086257f16c9d6aeb03da4524295c0 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Wed, 29 Jun 2016 12:36:47 -0700 Subject: [PATCH 071/831] Add option into MSBuild --- pages/Compiler Options in MSBuild.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index b162f3030..8b9585cda 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -58,6 +58,8 @@ Compiler Option | MSBuild Property Name `--noImplicitReturns` | TypeScriptNoImplicitReturns | boolean `--noImplicitThis` | TypeScriptNoImplicitThis | boolean `--noImplicitUseStrict` | TypeScriptNoImplicitUseStrict | boolean +`--noUnusedLocals` | TypeScriptNoUnusedVariables | boolean +`--noUnusedParameters` | TypeScriptNoUnusedParameters | boolean `--noLib` | TypeScriptNoLib | boolean `--noResolve` | TypeScriptNoResolve | boolean `--out` | TypeScriptOutFile | File path From 33adc72b302aaa3de9be693f0c347263794bf802 Mon Sep 17 00:00:00 2001 From: Yui Date: Wed, 29 Jun 2016 15:02:23 -0700 Subject: [PATCH 072/831] Correct name of MSBuild --- pages/Compiler Options in MSBuild.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index 8b9585cda..76ba97d11 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -58,7 +58,7 @@ Compiler Option | MSBuild Property Name `--noImplicitReturns` | TypeScriptNoImplicitReturns | boolean `--noImplicitThis` | TypeScriptNoImplicitThis | boolean `--noImplicitUseStrict` | TypeScriptNoImplicitUseStrict | boolean -`--noUnusedLocals` | TypeScriptNoUnusedVariables | boolean +`--noUnusedLocals` | TypeScriptNoUnusedLocals | boolean `--noUnusedParameters` | TypeScriptNoUnusedParameters | boolean `--noLib` | TypeScriptNoLib | boolean `--noResolve` | TypeScriptNoResolve | boolean From cb4086cd352790dee977d75065d3a24ca7099955 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Wed, 29 Jun 2016 15:46:00 -0700 Subject: [PATCH 073/831] Address first round of PR comments --- pages/Advanced Types.md | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 14387168d..650f56198 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -348,19 +348,19 @@ type Yikes = Array; // error As we mentioned, type aliases can act sort of like interfaces; however, there are some subtle differences. One difference is that interfaces create a new name that is used everywhere. -Type aliases don't create a new name -- intellisense doesn't show the alias name, for example. +Type aliases don't create a new name — for instance, error messages won't use the alias name. In the code below, intellisense will show that `interfaced` requires and returns an `Interface`, but `aliased` will show object literal types. ```ts type Alias = { num: number } interface Interface { - num: number; + num: number; } declare function aliased(arg: Alias): Alias; declare function interfaced(arg: Interface): Interface; ``` -A second, more important difference is that type aliases cannot be extended or implemented from (nor can they extend/implement other types). +A second more important difference is that type aliases cannot be extended or implemented from (nor can they extend/implement other types). Because [an ideal property of software is being open to extension](https://en.wikipedia.org/wiki/Open/closed_principle), you should always use an interface over a type alias if possible. On the other hand, if you can't express some shape with an interface and you need to use a union or tuple type, type aliases are usually the way to go. @@ -412,15 +412,14 @@ function createElement(tagName: string): Element { # Discriminated Unions -You can combine string literal types, union types, type guards and type aliases to build an advanced pattern called *discriminated unions*. +You can combine string literal types, union types, type guards and type aliases to build an advanced pattern called *discriminated unions*, also known as *tagged unions* or *algebraic data types*. Discriminated unions are useful in functional programming. -TypeScript doesn't have built-in support for this pattern, but you can get the compiler to check it once you have it set up. +Some languages automatically discriminate unions for you; TypeScript instead builds on JavaScript patterns as they exist today. There are four ingredients: -1. Interfaces with a common property of a string-literal type -2. A type alias that unions the interfaces -3. Type guards on the common property -4. Exhaustiveness checking (optional) +1. Types that have a common, string literal property -- the *discriminant*. +2. A type alias that takes the union of those types -- the *union*. +3. Type guards on the common property. ```ts interface Square { @@ -441,7 +440,7 @@ interface Circle { First we declare the interfaces we will union. Each interface has a `kind` property with a different string literal type. The `kind` property is called the *discriminant* or *tag*. -The other properties are the important parts of each interface. +The other properties are specific to each interface. Notice that the interfaces are currently unrelated. Let's put them into a union: @@ -453,10 +452,10 @@ Now let's use the discriminated union: ```ts function area(s: Shape) { - switch(s.kind) { + switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; - case "circle": return Math.PI * s.radius * s.radius; + case "circle": return Math.PI * s.radius ** 2; } } ``` @@ -469,12 +468,12 @@ For example, if we add `Triangle` to `Shape`, we need to update `area` as well: ```ts type Shape = Square | Rectangle | Circle | Triangle; function area(s: Shape) { - switch(s.kind) { + switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; - case "circle": return Math.PI * s.radius * s.radius; + case "circle": return Math.PI * s.radius ** 2; } - // should error here -- we didn't handle case "triangle" + // should error here - we didn't handle case "triangle" } ``` @@ -483,10 +482,10 @@ The first is to turn on `--strictNullChecks` and specify a return type: ```ts function area(s: Shape): number { // error: returns number | undefined - switch(s.kind) { + switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; - case "circle": return Math.PI * s.radius * s.radius; + case "circle": return Math.PI * s.radius ** 2; } } ``` @@ -502,16 +501,16 @@ function assertNever(x: never): never { throw new Error("Unexpected object: " + x); } function area(s: Shape) { - switch(s.kind) { + switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; - case "circle": return Math.PI * s.radius * s.radius; + case "circle": return Math.PI * s.radius ** 2; default: return assertNever(s); // error here if there are missing cases } } ``` -Here, `assertNever` checks that `s` is of type `never` -- the type that's left after all other cases have been removed. +Here, `assertNever` checks that `s` is of type `never` — the type that's left after all other cases have been removed. If you forget a case, then `s` will have a real type and you will get a type error. This method requires you to define an extra function, but it's much more obvious when you forget it. From 4edb1020cd3f4ef2bfbc4ab372c6182e739724b8 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 1 Jul 2016 13:00:30 -0700 Subject: [PATCH 074/831] Fix typo --- pages/Module Resolution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 105b762b1..2a9862d8c 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -407,7 +407,7 @@ Compiling `app.ts` using `--noResolve` should result in: ## Common Questions -### Why does a module in `exclude` list is still picked up by the compiler +### Why is a module in the `exclude` list still picked up by the compiler? `tsconfig.json` turns a folder into a “project”. Without specifying any `“exclude”` or `“files”` entries, all files in the folder containing the `tsconfig.json` and all its sub-directories are included in your compilation. From a2d9c62bdf8b3fd61fdc175849f2192f9c64b8f3 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 1 Jul 2016 14:00:43 -0700 Subject: [PATCH 075/831] Improve wording --- pages/Module Resolution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 2a9862d8c..8660e9b5d 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -407,7 +407,7 @@ Compiling `app.ts` using `--noResolve` should result in: ## Common Questions -### Why is a module in the `exclude` list still picked up by the compiler? +### Why does a module in the exclude list still get picked up by the compiler? `tsconfig.json` turns a folder into a “project”. Without specifying any `“exclude”` or `“files”` entries, all files in the folder containing the `tsconfig.json` and all its sub-directories are included in your compilation. From db97b7221b4cea98c982fd9555adc00badb381fb Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 3 Jul 2016 20:56:04 -0700 Subject: [PATCH 076/831] Update to latest markdownlint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dfc5fc610..6eb02267b 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,6 @@ "homepage": "https://github.com/Microsoft/TypeScript-Handbook#readme", "devDependencies": { "glob": "^5.0.15", - "markdownlint": "0.0.8" + "markdownlint": "latest" } } From 48ac7f9bbd4a83062c94d8d364fe6dc42f23247b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 3 Jul 2016 22:48:05 -0700 Subject: [PATCH 077/831] Intiial commit of @RyanCavanaugh's documentation --- .../Adding to DefinitelyTyped.md | 24 ++ pages/declaration files/By Example.md | 254 +++++++++++++ pages/declaration files/Deep Dive.md | 209 +++++++++++ pages/declaration files/Do's and Don'ts.md | 208 +++++++++++ pages/declaration files/Introduction.md | 46 +++ pages/declaration files/Library Structures.md | 352 ++++++++++++++++++ pages/declaration files/presentation.md | 70 ++++ .../templates/global-modifying-module.d.ts | 33 ++ .../templates/global-plugin.d.ts | 25 ++ pages/declaration files/templates/global.d.ts | 62 +++ .../templates/module-class.d.ts | 47 +++ .../templates/module-function.d.ts | 56 +++ .../templates/module-plugin.d.ts | 34 ++ pages/declaration files/templates/module.d.ts | 45 +++ pages/declaration files/todo.md | 32 ++ 15 files changed, 1497 insertions(+) create mode 100644 pages/declaration files/Adding to DefinitelyTyped.md create mode 100644 pages/declaration files/By Example.md create mode 100644 pages/declaration files/Deep Dive.md create mode 100644 pages/declaration files/Do's and Don'ts.md create mode 100644 pages/declaration files/Introduction.md create mode 100644 pages/declaration files/Library Structures.md create mode 100644 pages/declaration files/presentation.md create mode 100644 pages/declaration files/templates/global-modifying-module.d.ts create mode 100644 pages/declaration files/templates/global-plugin.d.ts create mode 100644 pages/declaration files/templates/global.d.ts create mode 100644 pages/declaration files/templates/module-class.d.ts create mode 100644 pages/declaration files/templates/module-function.d.ts create mode 100644 pages/declaration files/templates/module-plugin.d.ts create mode 100644 pages/declaration files/templates/module.d.ts create mode 100644 pages/declaration files/todo.md diff --git a/pages/declaration files/Adding to DefinitelyTyped.md b/pages/declaration files/Adding to DefinitelyTyped.md new file mode 100644 index 000000000..51888edf3 --- /dev/null +++ b/pages/declaration files/Adding to DefinitelyTyped.md @@ -0,0 +1,24 @@ +# Creating a New DefinitelyTyped File + +This page will walk you through how to create a new folder in DefinitelyTyped. + +## Create the Folder + +Naming + +## Copy from _template + +## Rename `-tests.ts` + +## Modify tsconfig.json + +Use the template, modify files param, leave remainder untouched + +## Write Your File + +## Test for Compilation + +## Test for Conformance + +## Test for Breaks + diff --git a/pages/declaration files/By Example.md b/pages/declaration files/By Example.md new file mode 100644 index 000000000..481c28eef --- /dev/null +++ b/pages/declaration files/By Example.md @@ -0,0 +1,254 @@ +# Definition Files by Example + +## Introduction + +The purpose of this guide is to teach you how to write a high-quality definition file. +This guide is structured by showing an example *usage* and *documentation*, + and explaining how to write the corresponding declaration. + +These examples are ordered in approximately increasing order of complexity. + + + + + + +- [The Examples](#the-examples) + - [Global variable](#global-variable) + - [Global function](#global-function) + - [Object with Properties](#object-with-properties) + - [Overloaded function](#overloaded-function) + - [Reusable Types (Global)](#reusable-types-global) + - [Classes](#classes) + + + + +## The Examples + +### Global variables + +*Documentation* +> The global variable `foo` contains the number of widgets present. + +*Code* +```ts +console.log('Half the number of widgets is ' + (foo / 2)); +``` + +*Declaration* +Use `declare var` to declare variables. +If the variable is read-only, you can use `declare const`. +You can also use `declare let` if the variable is block-scoped. +```ts +/** The number of widgets present */ +declare var foo: number; +``` + +### Global functions + +*Documentation* +> You can invoke the function `greet` with a string to show a greeting to the user. + +*Code* +``` +greet('hello, world'); +``` + +*Declaration* + +Use `declare function` to declare functions. +```ts +declare function greet(greeting: string): void; +``` + +### Objects with Properties + +*Documentation* +> The global variable `myLib` has a function `makeGreeting` for creating greetings, +> and a property `numberOfGreetings` indicating the number of greetings made so far. + +*Code* +```ts +var result = myLib.makeGreeting('hello, world'); +console.log('The computed greeting is:' + result); +var count = myLib.numberOfGreetings; +``` + +*Declaration* + +Use `declare namespace` to describe types or values accessed by dotted notation. +```ts +declare namespace myLib { + function makeGreeting(s: string): string; + let numberOfGreetings: number; +} +``` + +### Overloaded functions + +*Documentation* +> The `getWidget` function accepts a number and return a Widget, or accepts a string and returns a Widget array + +*Code* +```ts +let x: Widget = getWidget(43); +let arr = getWidget('all of them'); // arr: Widget[] +``` + +*Declaration* +```ts +declare function getWidget(n: number): Widget; +declare function getWidget(s: string): Widget[]; +``` + +### Reusable Types (interfaces) + +*Documentation* +> When specifying a greeting, you must pass a GreetingSettings object. +> This object has the following properties: +> * greeting: Mandatory string +> * duration: Optional length of time (in milliseconds) +> * color: Optional string, e.g. '#ff00ff' + +*Code* +```ts +greet({ + greeting: 'hello world', + duration: 4000 +}); +``` + +*Declaration* + +Use `interface` to define a type with properties. +```ts +interface GreetingSettings { + greeting: string; + duration?: number; + color?: string; +} +declare function greet(setting: GreetingSettings): void; +``` + +### Reusable Types (type aliases) + +*Documentation* +> Anywhere a greeting is expected, you can provide a `string`, +> a function returning a `string`, or a `Greeter` class. + +*Code* +```ts +function getGreeting() { + return 'howdy'; +} +class MyGreeter extends Greeter { } + +greet('hello'); +greet(getGreeting); +greet(new MyGreeter()); +``` + +*Declaration* + +You can use a type alias to make a shorthand for a type: +```ts +type GreetingLike = string | (() => string) | Greeting; + +declare function greet(g: GreetingLike): void; +``` + +### Organizing Types + +*Documentation* +> The `greeter` object can log to a file, or display an alert. +> You can provide LogOptions to `.log(...)` or alert options to `.alert(...)` + +*Code* +```ts +const g = new Greeter('Hello'); +g.log({ verbose: true }); +g.alert({ modal: false, title: 'Current Greeting' }); +``` + +*Declaration* + +Use namespaces to organize types. +```ts +declare namespace GreetingLib { + interface LogOptions { + verbose?: boolean; + } + interface AlertOptions { + modal: boolean; + title?: string; + color?: string; + } +} +``` + +You can also created nested namespaces in one declaration: +```ts +declare namespace GreetingLib.Options { + // Refer to via GreetingLib.Options.Log + interface Log { + verbose?: boolean; + } + interface Alert { + modal: boolean; + title?: string; + color?: string; + } +} +``` + +### Classes + +*Documentation* +> You can create a greeter by instantiating the `Greeter` object, +> or create a customized greeter by extending from it. + +*Code* +```ts +const myGreeter = new Greeter('hello, world'); +myGreeter.greeting = 'howdy'; +myGreeter.showGreeting(); + +class SpecialGreeter extends Greeter { + constructor() { + super('Very special greetings'); + } +} +``` + +*Declaration* +Use `declare class` to describe a class or classlike object. +Classes can have properties and methods as well as a constructor. +```ts +declare class Greeter { + constructor(greeting: string); + + greeting: string; + showGreeting(): void; +} +``` + + diff --git a/pages/declaration files/Deep Dive.md b/pages/declaration files/Deep Dive.md new file mode 100644 index 000000000..cdd89668c --- /dev/null +++ b/pages/declaration files/Deep Dive.md @@ -0,0 +1,209 @@ +# Definition File Theory: A Deep Dive + +Structuring modules to give the exact API shape you want can be tricky. +For example, we might want a module that can be invoked with or without `new` to produce different types, + has a variety of named types exposed in a hierarchy, + and has some properties on the module object as well. + +By reading this guide, you'll have the tools to write complex definition files that expose a friendly API surface. +This guide focuses on module (or UMD) libraries because the options here are more varied. + +## Key Concepts + +You can fully understand how to make any shape of definition + by understanding some key concepts of how TypeScript works. + +### Types + +If you're reading this guide, you probably already roughly know what a type in TypeScript is. +To be more explicit, though, a *type* is introduced with: + * A type alias declaration (`type sn = number | string;`) + * An interface declaration (`interface I { x: number[]; }`) + * A class declaration (`class C { }`) + * An enum declaration (`enum E { A, B, C }`) + * An `import` declaration which refers to a type + +Each of these declaration forms creates a new type name. + +### Values + +As with types, you probably already understand what a value is. +Values are runtime names that we can reference in expressions. +For example `let x = 5;` creates a value called `x`. + +Again, being explicit, the following things create values: + * `let`, `const`, and `var` declarations + * A `namespace` or `module` declaration which contains a value + * An `enum` declaration + * A `class` declaration + * An `import` declaration which refers to a value + * A `function` declaration + +### Namespaces + +Types can exist in *namespaces*. +For example, if we have the declaration `let x: A.B.C`, + we say that the type `C` comes from the `A.B` namespace. + +This distinction is subtle and important -- here, `A.B` is not necessarily a type or a value. + +## Simple Combinations: One name, multiple meanings + +Given a name `A`, we might find up to three different meanings for `A`: a type, a value or a namespace. +How the name is interpreted depends on the context in which it is used. +For example, in the declaration `let m: A.A = A;`, + `A` is used first as a namespace, then as a type name, then as a value. +These meanings might end up referring to entirely different declarations! + +This may seem confusing, but it's actually very convenient as long as we don't excessively overload things. +Let's look at some useful aspects of this combining behavior. + +### Built-in Combinations + +Astute readers will notice that, for example, `class` appeared in both the *type* and *value* lists. +The declaration `class C { }` creates two things: + a *type* `C` which refers to the instance shape of the class, + and a *value* `C` which refers to the constructor function of the class. +Enum declarations behave similarly. + +### User Combinations + +Let's say we wrote a module file `foo.d.ts`: +```ts +export var SomeVar: { a: SomeType }; +export interface SomeVar { + count: number; +} +``` +Then consumed it: +```ts +import * as foo from './foo'; +let x: foo.SomeType = foo.SomeVar.a; +console.log(x.count); +``` +This works well enough, but we might imagine that `SomeType` and `SomeVar` were very closely related + such that you'd like them to have the same name. +We can use combining to present these two different objects (the value and the type) under the same name `Bar`: +```ts +export var Bar: { a: Bar }; +export interface Bar { + count: number; +} +``` +This presents a very good opportunity for destructuring in the consuming code: +```ts +import { Bar } from './foo'; +let x: Bar = Bar.a; +console.log(x.count); +``` +Again, we've used `Bar` as both a type and a value here. +Note that we didn't have to declare the `Bar` value as being of the `Bar` type -- they're independent. + +## Advanced Combinations + +Some kinds of declarations can be combined across multiple declarations. +For example, `class C { }` and `interface C { }` can co-exist and both contribute properties to the `C` types. + +This is legal as long as it does not create a conflict. +A general rule of thumb is that values always conflict with other values of the same name unless they are declared as `namespace`s, + types will conflict if they are declared with a type alias declaration (`type s = string`), + and namespaces never conflict. + +Let's see how this can be used. + +### Adding using an `interface` + +We can add additional members to an `interface` with another `interface` declaration: +```ts +interface Foo { + x: number; +} +// ... elsewhere ... +interface Foo { + y: number; +} +let a: Foo = ...; +console.log(a.x + a.y); // OK +``` +This also works with classes: +```ts +class Foo { + x: number; +} +// ... elsewhere ... +interface Foo { + y: number; +} +let a: Foo = ...; +console.log(a.x + a.y); // OK +``` +Note that we cannot add to type aliases (`type s = string;`) using an interface. + +### Adding using a `namespace` + +A `namespace` declaration can be used to add new types, values, and namespaces in any way which does not create a conflict. + +For example, we can add a static member to a class: +```ts +class C { +} +// ... elsewhere ... +namespace C { + export let x: number; +} +let y = C.x; // OK +``` +Note that in this example, we added a value to the *static* side of `C` (its constructor function). +This is because we added a *value*, and the container for all values is another value + (types are contained by namespaces, and namespaces are contained by other namespaces). + +We could also add a namespaced type to a class: +```ts +class C { +} +// ... elsewhere ... +namespace C { + export interface D { } +} +let y: C.D; // OK +``` +In this example, there wasn't a namespace `C` until we wrote the `namespace` declaration for it. +The meaning `C` as a namespace doesn't conflict with the value or type meanings of `C` created by the class. + +Finally, we could perform many different merges using `namespace` declarations. +This isn't a particularly realistic example, but shows all sorts of interesting behavior: +```ts +namespace X { + export interface Y { } + export class Z { } +} + +// ... elsewhere ... +namespace X { + export var Y: number; + export namespace Z { + export class C { } + } +} +type X = string; +``` +In this example, the first block creates the following name meanings: + * A value `X` (because the `namespace` declaration contains a value, `Z`) + * A namespace `X` (because the `namespace` declaration contains a type, `Y`) + * A type `Y` in the `X` namespace + * A type `Z` in the `X` namespace (the instance shape of the class) + * A value `Z` that is a property of the `X` value (the constructor function of the class) + +The second block creates the following name meanings: + * A value `Y` (of type `number`) that is a property of the `X` value + * A namespace `Z` + * A value `Z` that is a property of the `X` value + * A type `C` in the `X.Z` namespace + * A value `C` that is a property of the `X.Z` value + * A type `X` + +## Using with `export =` or `import` + +An important rule is that `export` and `import` declarations export or import *all meanings* of their targets. + +TODO: Write more on that. diff --git a/pages/declaration files/Do's and Don'ts.md b/pages/declaration files/Do's and Don'ts.md new file mode 100644 index 000000000..c96ad4ccf --- /dev/null +++ b/pages/declaration files/Do's and Don'ts.md @@ -0,0 +1,208 @@ +# Do's and Don'ts + +## General Types + +### `Number`, `String`, `Boolean`, and `Object` + +*Don't* ever use the types `Number`, `String`, `Boolean`, or `Object`. +These types refer to non-primitive boxed objects that are almost never used appropriately in JavaScript code. +```ts +/* WRONG */ +function reverse(s: String): String; +``` + +*Do* use the types `number`, `string`, and `boolean`. +```ts +/* OK */ +function reverse(s: string): string; +``` + +If you're tempted to use the type `Object`, consider using `any` instead. +There is currently no way in TypeScript to specify an object that is "not a primitive". + + +## Generics + +*Don't* ever have a generic type which doesn't use its type parameter. +TODO: Link to FAQ + +TODO: More + +## Callback Types + +### Return Types of Callbacks + + + +*Don't* use the return type `any` for callbacks whose value will be ignored: +```ts +/* WRONG */ +function fn(x: () => any) { + x(); +} +``` + +*Do* use the return type `void` for callbacks whose value will be ignored: +```ts +/* OK */ +function fn(x: () => void) { + x(); +} +``` + +*Why*: Using `void` is safer because it prevents you from accidently using the return value of `x` in an unchecked way: +```ts +function fn(x: () => void) { + var k = x(); // oops! meant to do something else + k.doSomething(); // error, but would be OK if the return type had been 'any' +} +``` + +### Optional Parameters in Callbacks + +*Don't* use optional parameters in callbacks unless you really mean it: +```ts +/* WRONG */ +interface Fetcher { + getObject(done: (data: any, elapsedTime?: number) => void): void; +} +``` +This has a very specific meaning: the `done` callback might be invoked with 1 argument or might be invoked with 2 arguments. +The author probably intended to say that the callback might not care about the `elapsedTime` parameter, + but there's no need to make the parameter optional to accomplish this -- + it's always legal to provide a callback that accepts fewer arguments. + +*Do* write callback parameters as non-optional: +```ts +/* OK */ +interface Fetcher { + getObject(done: (data: any, elapsedTime: number) => void): void; +} +``` + +### Overloads and Callbacks + +*Don't* write separate overloads that differ only on callback arity: +```ts +/* WRONG */ +declare function beforeAll(action: () => void, timeout?: number): void; +declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void; +``` + +*Do* write a single overload using the maximum arity: +```ts +/* OK */ +declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): void; +``` + +*Why*: It's always legal for a callback to disregard a parameter, so there's no need for the shorter overload. +Providing a shorter callback first allows incorrectly-typed functions to be passed in because they match the first overload. + +## Function Overloads + +### Ordering + +*Don't* put more general overloads before more specific overloads: +```ts +/* WRONG */ +declare function fn(x: any): any; +declare function fn(x: HTMLElement): number; +declare function fn(x: HTMLDivElement): string; + +var myElem: HTMLDivElement; +var x = fn(myElem); // x: any, wat? +``` + +*Do* sort overloads by putting the more general signatures after more specific signatures: +```ts +/* OK */ +declare function fn(x: HTMLDivElement): string; +declare function fn(x: HTMLElement): number; +declare function fn(x: any): any; + +var myElem: HTMLDivElement; +var x = fn(myElem); // x: string, :) +``` + +*Why*: TypeScript chooses the *first matching overload* when resolving function calls. +When an earlier overload is "more general" than a later one, the later one is effectively hidden and cannot be called. + +### Use Optional Parameters + +*Don't* write several overloads that differ only in trailing parameters: +```ts +/* WRONG */ +interface Moment { + diff(b: MomentComparable): number; + diff(b: MomentComparable, unitOfTime: string): number; + diff(b: MomentComparable, unitOfTime: string, round: boolean): number; +} +``` + +*Do* use optional parameters whenever possible: +```ts +/* OK */ +interface Moment { + diff(b: MomentComparable, unitOfTime?: string, round?: boolean): number; +} +``` + +Note that this collapsing should only occur when all overloads have the same return type. + +*Why*: This is important for two reasons. + +TypeScript resolves signature compatibility by seeing if any signature of the target can be invoked with the arguments of the source, + *and extraneuous arguments are allowed*. +This code, for example, exposes a bug only when the signature is correctly written using optional parameters: +```ts +function fn(x: (a: string, b: number, c: number) => void) { } +var x: Moment; +// When written with overloads, OK -- used first overload +// When written with optionals, correctly an error +fn(x.diff); +``` + +The second reason is when a consumer uses the "strict null checking" feature of TypeScript. Because unspecified parameters appear as `undefined` in JavaScript, it's usually fine to pass an explicit `undefined` to a function with optional arguments. +This code, for example, should be OK under strict nulls: +```ts +var x: Moment; +// When written with overloads, incorrectly an error because of passing 'undefined' to 'string' +// When written with optionals, correctly OK +x.diff(something, someOtherThing ? undefined : "hour"); +``` + +### Use Union Types + +*Don't* write overloads that differ by type in only one argument position: +```ts +/* WRONG */ +interface Moment { + utcOffset(): number; + utcOffset(b: number): Moment; + utcOffset(b: string): Moment; +} +``` + +*Do* use union types whenver possible: +```ts +/* OK */ +interface Moment { + utcOffset(): number; + utcOffset(b: number|string): Moment; +} +``` + +Note that we didn't make `b` optional here because the return types of the signatures differ. + +*Why*: This is important for people who are "passing through" a value to your function: +```ts +function fn(x: string): void; +function fn(x: number): void; +function fn(x: number|string) { + // When written with separate overloads, incorrectly an error + // When written with union types, correctly OK + return moment().utcOffset(x); +} +``` + + diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md new file mode 100644 index 000000000..44fffb54e --- /dev/null +++ b/pages/declaration files/Introduction.md @@ -0,0 +1,46 @@ +# .d.ts File Writing: A Complete Guide + +## Introduction + +This guide is designed to teach you how to write a high-quality TypeScript Declaration File. + +In this guide, we'll assume basic familiarity with the TypeScript language. +If you haven't already, you should read the [https://www.typescriptlang.org/docs/handbook/basic-types.html](TypeScript Handbook) + to familiarize yourself with basic concepts, especially types and namespaces. + + +## Sections + +The guide is broken down into the following sections. + +### Library Structures + +The [Library Structures] guide helps you understand common library formats and how to write a correct declaration file for each formats. +If you're editing an existing file, you probably don't need to read this section. +Authors of new declaration files must read this section to properly understand how the format of the library influences the writing of the declaration file. + +### Do's and Don'ts + +Many common mistakes in declaration files can be easily avoided. +The [Do's and Don'ts] section identifies common errors, + desscribes how to detect them, + and how to fix them. +Everyone should read this section to help themselves avoid common mistakes. + +### By Example + +Many times, we are faced with writing a declaration file when we only have examples of the underlying library to guide us. +The [By Example] section shows many common API patterns and how to write declarations for each of them. +This guide is aimed at the TypeScript novice who may not yet be familiar with every language construct in TypeScript. + +### Deep Dive + +For seasoned authors interested in the underlying mechanics of how declaration files work, + the [Deep Dive] section explains many advanced concepts in declaration writing, + and shows how to leverage these concepts to create cleaner and more intuitive declaration files. + +### `/templates` + +In the `templates` directory, you'll find a number of declaration files that serve as a useful starting point + when writing a new file. +Refer to the documentation in [Library Structures] to figure out which template file to use. diff --git a/pages/declaration files/Library Structures.md b/pages/declaration files/Library Structures.md new file mode 100644 index 000000000..f624a1b4e --- /dev/null +++ b/pages/declaration files/Library Structures.md @@ -0,0 +1,352 @@ +# Structuring: Overview + +Broadly speaking, the way you *structure* your definition file depends on how the library is consumed. +There are many ways of offering a library for consumption in JavaScript, + and you'll need to write your definition file to match it. +This guide covers how to identify common library patterns, + and how to write definition files which correspond to that pattern. + +Each type of major library structuring pattern has a corresponding file in the `templates` directory. +You can start with these templates to help you get going faster. + +# Identifying Kinds of Libraries + +First, we'll review the kinds of libraries TypeScript definition files can represent. +We'll briefly show how each kind of library is *used*, + how it is *written*, + and list some example libraries from the real world. + +Identifying the structure of a library is the first step in writing its definition file. +We'll give hints on how to identify structure both based on its *usage* and its *code*. +Depending on the library's documentation and organization, one might be easier than the other. +We recommend using whichever is more comfortable to you. + +## *global* + +A *global* library is one that can be accessed from the global scope (i.e. without using any form of `import`). +Many libraries simply expose one or more global variables for use. +For example, if you were using jQuery, the `$` variable can be used by simply referring to it: +```ts +$(() => { console.log('hello!'); } ); +``` + +You'll usually see guidance in the documentation of a global library of how to use the library in a script tag: +```html + +``` + +Today, most popular globally-accessible libraries are actually written as UMD libraries (see below). +UMD library documentation is hard to distinguish from global library documentation. +Before writing a global definition file, make sure the library isn't actually UMD. + +### Identifying a Global Library from Code + +Global library code is usually extremely simple. +A global "Hello, world" library might look like this: +```js +function createGreeting(s) { + return 'Hello, ' + s; +} +``` +or like this: +```js +window.createGreeting = function(s) { + return 'Hello, ' + s; +} +``` + +When looking at the code of a global library, you'll usually see: + + * Top-level `var` statements or `function` declarations + * One or more assignments to `window.someName` + * Assumptions that DOM primitives like `document` or `window` exist + +You *won't* see: + + * Checks for, or usage of, module loaders like `require` or `define` + * CommonJS/nodejs-style imports of the form `var fs = require('fs');` + * Calls to `define(...)` + * Documentation describing how to `require` the library + +### Examples of Global Libraries + +Because it's usually easy to turn a global library into a UMD library, + very few popular libraries are still written in the global style. +However, libraries that are small and require the DOM (or have *no* dependencies) may still be global. + +### Template + +The template file `global.d.ts` defines an example library `myLib`. +Be sure to read the "Preventing Name Conflicts" footnote. + +## *module* + +Some libraries only work in a module loader environment. +For example, because `express` only works in NodeJS, + it must be loaded using the CommonJS `require` function. + +ECMAScript 2016 (also known as ES2015, ECMAScript 6, ES6), CommonJS, and RequireJS have similar notions of *importing* a *module*. +In JavaScript CommonJS (nodejs), for example, you would write +```ts +var fs = require('fs'); +``` +In TypeScript or ES6, the `import` keyword serves the same purpose: +```ts +import fs = require('fs'); +``` + +You'll typically see module libraries include one of these lines in their documentation: +```js +var someLib = require('someLib'); +``` +or +```ts +define(..., ['someLib'], function(someLib) { + +}); +``` + +As with global modules, you might see these examples in the documentation of a UMD module, + so be sure to check the code or documentation. + +### Identifying a Module Library from Code + +Module libraries will typically have at least some of the following: + + * Unconditional calls to `require` or `define`* + * Declarations like `import * as a from 'b';` or `export c;` + * Assignments to `exports` or `module.exports` + +They will rarely have: + + * Assignments to properties of `window` or `global` + +### Examples of Module Libraries + +Many popular nodejs libraries are in the module family, such as `express`, `gulp`, and `request`. + +## *UMD* + +A *UMD* module is one that can *either* be used as module (through an import), + or as a global (when run in an environment without a module loader). +Many popular libraries, such as `moment`, are written this way. +For example, in nodejs, you would write: +```ts +import moment = require('moment'); +console.log(moment.format()); +``` +whereas in a vanilla browser environment you would write: +```ts +console.log(moment.format()); +``` + +### Identifying a UMD library + +(UMD modules)[https://github.com/umdjs/umd] check for the existence of a module loader environment. +This is an easy-to-spot pattern that looks something like this: +```js +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define(['b'], factory); + } else if (typeof module === 'object' && module.exports) { + module.exports = factory(require('b')); + } else { + root.returnExports = factory(root.b); + } +}(this, function (b) { + ``` + +If you see tests for `typeof define`, `typeof window`, or `typeof module` in the code of a library, + especially at the top of the file, + it's almost always a UMD library. + +Documentation for UMD libraries will also often demonstrate a "Using in nodejs" example showing `require` + and a "Using in browser" example showing using a ` ``` @@ -43,30 +45,33 @@ Before writing a global definition file, make sure the library isn't actually UM Global library code is usually extremely simple. A global "Hello, world" library might look like this: + ```js function createGreeting(s) { - return 'Hello, ' + s; + return 'Hello, ' + s; } ``` + or like this: + ```js window.createGreeting = function(s) { - return 'Hello, ' + s; + return 'Hello, ' + s; } ``` When looking at the code of a global library, you'll usually see: - * Top-level `var` statements or `function` declarations - * One or more assignments to `window.someName` - * Assumptions that DOM primitives like `document` or `window` exist +* Top-level `var` statements or `function` declarations +* One or more assignments to `window.someName` +* Assumptions that DOM primitives like `document` or `window` exist You *won't* see: - * Checks for, or usage of, module loaders like `require` or `define` - * CommonJS/nodejs-style imports of the form `var fs = require('fs');` - * Calls to `define(...)` - * Documentation describing how to `require` the library +* Checks for, or usage of, module loaders like `require` or `define` +* CommonJS/nodejs-style imports of the form `var fs = require('fs');` +* Calls to `define(...)` +* Documentation describing how to `require` the library ### Examples of Global Libraries @@ -87,22 +92,28 @@ For example, because `express` only works in NodeJS, ECMAScript 2016 (also known as ES2015, ECMAScript 6, ES6), CommonJS, and RequireJS have similar notions of *importing* a *module*. In JavaScript CommonJS (nodejs), for example, you would write + ```ts var fs = require('fs'); ``` + In TypeScript or ES6, the `import` keyword serves the same purpose: + ```ts import fs = require('fs'); ``` You'll typically see module libraries include one of these lines in their documentation: + ```js var someLib = require('someLib'); ``` + or + ```ts define(..., ['someLib'], function(someLib) { - + }); ``` @@ -113,13 +124,13 @@ As with global modules, you might see these examples in the documentation of a U Module libraries will typically have at least some of the following: - * Unconditional calls to `require` or `define`* - * Declarations like `import * as a from 'b';` or `export c;` - * Assignments to `exports` or `module.exports` +* Unconditional calls to `require` or `define`* +* Declarations like `import * as a from 'b';` or `export c;` +* Assignments to `exports` or `module.exports` They will rarely have: - * Assignments to properties of `window` or `global` +* Assignments to properties of `window` or `global` ### Examples of Module Libraries @@ -131,19 +142,23 @@ A *UMD* module is one that can *either* be used as module (through an import), or as a global (when run in an environment without a module loader). Many popular libraries, such as `moment`, are written this way. For example, in nodejs, you would write: + ```ts import moment = require('moment'); console.log(moment.format()); ``` + whereas in a vanilla browser environment you would write: + ```ts console.log(moment.format()); ``` ### Identifying a UMD library -(UMD modules)[https://github.com/umdjs/umd] check for the existence of a module loader environment. +[UMD modules](https://github.com/umdjs/umd) check for the existence of a module loader environment. This is an easy-to-spot pattern that looks something like this: + ```js (function (root, factory) { if (typeof define === 'function' && define.amd) { @@ -154,7 +169,7 @@ This is an easy-to-spot pattern that looks something like this: root.returnExports = factory(root.b); } }(this, function (b) { - ``` +``` If you see tests for `typeof define`, `typeof window`, or `typeof module` in the code of a library, especially at the top of the file, @@ -174,19 +189,23 @@ There are three templates available for modules, `module.d.ts`, `module-class.d.ts` and `module-callable.d.ts`. Use `module-callable.d.ts` if your module can be *called* like a function: + ```ts var x = require('foo'); // Note: calling 'x' as a function var y = x(42); ``` + Be sure to read the footnote "The Impact of ES6 on Module Call Signatures" Use `module-class.d.ts` if your module can be *constructed* using `new`: + ```ts var x = require('bar'); // Note: using 'new' operator on the imported variable var y = new x('hello'); ``` + The same footnote applies to these modules. If your module is not callable or constructable, use the `module.d.ts` file. @@ -215,6 +234,7 @@ For example, some libraries add new functions to `Array.prototype` or `String.pr Global plugins are generally easy to identify from their documentation. You'll see examples that look like this: + ```ts var x = 'hello, world'; // Creates new methods on built-in types @@ -242,6 +262,7 @@ Global-modifying modules are generally easy to identify from their documentation In general, they're similar to global plugins, but need a `require` call to activate their effects. You might see documentation like this: + ```ts // 'require' call that doesn't use its return value var unused = require('magic-string-time'); @@ -268,16 +289,19 @@ There are several kinds of dependencies you might have. ## Dependencies on Global Libraries If your library depends on a global library, use a `/// function getThing(): someLib.thing; ``` + This syntax is the same regardless if your library is global, a module, or UMD ## Dependencies on Modules If your library depends on a module, use an `import` statement: + ```ts import * as moment from 'moment'; @@ -289,6 +313,7 @@ function getThing(): moment; ### From a Global Library If your global library depends on a UMD module, use a `/// @@ -298,11 +323,12 @@ function getThing(): moment; ### From a Module or UMD Library If your module or UMD library depends on a UMD library, use an `import` statement: + ```ts import * as someLib from 'someLib'; ``` -Do *not* use a `/// `@types` transition - * Rename `scripts` to `_scripts` - * Create and finish `_template` documentation and folder - * Ensure no `notNeeded` / `external` / local conflicts (already done?) - * Warn in README.md if `noImplicitAny` is off - * Include "last updated" date in README.md - * Figure out what to do with DT issue backlog - * Create bugs for any remaining bad-format files - * Endorse in README.md if `strictNullChecks` is on - * Add stat reporting on how many files are still `noImplicitAny: false` - * Eventually: validate all `tsconfig.json` files for conformance - * Add stat reporting on how many files are `strictNullChecks` - * Include this metadata in `package.json` so we can warn/bless - * Support moving authors to sidecar file in case list gets too long - - -Random thoughts - - * Game-ify DT -- e.g. what if definition files were awarded gold / silver / bronze medals? - * Platinum: Uses string enums, etc (hand-validated) - * Gold: Strict null checked - * Silver: JSDoc on 60%+ of members - * Bronze: No use of `any` - * Identify popular non-gold libraries, TypeScript team upgrades 1 / week - * Use to improve search relevance - * Send PRs of gold+-quality .d.ts files to underlying package's github pages to add badges - * Prizes? Bounties? What would $10,000 of .d.ts upgrades look like? - * Funding pitch: Easily saves us 2 weeks of work, great PR? - * From cf3cad9816c6992c817c4c8470b27aa722b908a2 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 3 Jul 2016 23:53:07 -0700 Subject: [PATCH 079/831] Add links --- pages/declaration files/Do's and Don'ts.md | 7 +++-- pages/declaration files/Introduction.md | 10 +++---- pages/declaration files/Library Structures.md | 28 +++++++++---------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/pages/declaration files/Do's and Don'ts.md b/pages/declaration files/Do's and Don'ts.md index bf3b65998..5055a8875 100644 --- a/pages/declaration files/Do's and Don'ts.md +++ b/pages/declaration files/Do's and Don'ts.md @@ -26,9 +26,9 @@ There is currently no way in TypeScript to specify an object that is "not a prim ## Generics *Don't* ever have a generic type which doesn't use its type parameter. -TODO: Link to FAQ +See more details in [TypeScript FAQ page](https://github.com/Microsoft/TypeScript/wiki/FAQ#why-doesnt-type-inference-work-on-this-interface-interface-foot---). -TODO: More + ## Callback Types @@ -177,7 +177,8 @@ var x: Moment; fn(x.diff); ``` -The second reason is when a consumer uses the "strict null checking" feature of TypeScript. Because unspecified parameters appear as `undefined` in JavaScript, it's usually fine to pass an explicit `undefined` to a function with optional arguments. +The second reason is when a consumer uses the "strict null checking" feature of TypeScript. +Because unspecified parameters appear as `undefined` in JavaScript, it's usually fine to pass an explicit `undefined` to a function with optional arguments. This code, for example, should be OK under strict nulls: ```ts diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index b49929d78..df6dcd1de 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -14,14 +14,14 @@ The guide is broken down into the following sections. ### Library Structures -The [Library Structures] guide helps you understand common library formats and how to write a correct declaration file for each formats. +The [Library Structures](./Library Structures.md) guide helps you understand common library formats and how to write a correct declaration file for each formats. If you're editing an existing file, you probably don't need to read this section. Authors of new declaration files must read this section to properly understand how the format of the library influences the writing of the declaration file. ### Do's and Don'ts Many common mistakes in declaration files can be easily avoided. -The [Do's and Don'ts] section identifies common errors, +The [Do's and Don'ts](./Do's and Don'ts.md) section identifies common errors, desscribes how to detect them, and how to fix them. Everyone should read this section to help themselves avoid common mistakes. @@ -29,17 +29,17 @@ Everyone should read this section to help themselves avoid common mistakes. ### By Example Many times, we are faced with writing a declaration file when we only have examples of the underlying library to guide us. -The [By Example] section shows many common API patterns and how to write declarations for each of them. +The [By Example](./By Example.md) section shows many common API patterns and how to write declarations for each of them. This guide is aimed at the TypeScript novice who may not yet be familiar with every language construct in TypeScript. ### Deep Dive For seasoned authors interested in the underlying mechanics of how declaration files work, - the [Deep Dive] section explains many advanced concepts in declaration writing, + the [Deep Dive](./Deep Dive.md) section explains many advanced concepts in declaration writing, and shows how to leverage these concepts to create cleaner and more intuitive declaration files. ### `/templates` In the `templates` directory, you'll find a number of declaration files that serve as a useful starting point when writing a new file. -Refer to the documentation in [Library Structures] to figure out which template file to use. +Refer to the documentation in [Library Structures](./Library Structures.md) to figure out which template file to use. diff --git a/pages/declaration files/Library Structures.md b/pages/declaration files/Library Structures.md index 5626a4555..b51425004 100644 --- a/pages/declaration files/Library Structures.md +++ b/pages/declaration files/Library Structures.md @@ -6,7 +6,7 @@ There are many ways of offering a library for consumption in JavaScript, This guide covers how to identify common library patterns, and how to write definition files which correspond to that pattern. -Each type of major library structuring pattern has a corresponding file in the `templates` directory. +Each type of major library structuring pattern has a corresponding file in the [`templates`](./templates) directory. You can start with these templates to help you get going faster. # Identifying Kinds of Libraries @@ -25,7 +25,7 @@ We recommend using whichever is more comfortable to you. A *global* library is one that can be accessed from the global scope (i.e. without using any form of `import`). Many libraries simply expose one or more global variables for use. -For example, if you were using jQuery, the `$` variable can be used by simply referring to it: +For example, if you were using [jQuery](https://jquery.com/), the `$` variable can be used by simply referring to it: ```ts $(() => { console.log('hello!'); } ); @@ -81,7 +81,7 @@ However, libraries that are small and require the DOM (or have *no* dependencies ### Template -The template file `global.d.ts` defines an example library `myLib`. +The template file [`global.d.ts`](./templates/global.d.ts) defines an example library `myLib`. Be sure to read the "Preventing Name Conflicts" footnote. ## *module* @@ -134,13 +134,13 @@ They will rarely have: ### Examples of Module Libraries -Many popular nodejs libraries are in the module family, such as `express`, `gulp`, and `request`. +Many popular nodejs libraries are in the module family, such as [`express`](http://expressjs.com/), [`gulp`](http://gulpjs.com/), and [`request`](https://github.com/request/request). ## *UMD* A *UMD* module is one that can *either* be used as module (through an import), or as a global (when run in an environment without a module loader). -Many popular libraries, such as `moment`, are written this way. +Many popular libraries, such as [`moment`](http://momentjs.com/), are written this way. For example, in nodejs, you would write: ```ts @@ -181,14 +181,14 @@ Documentation for UMD libraries will also often demonstrate a "Using in nodejs" ### Examples of UMD libraries Most popular libraries are now available as UMD packages. -Examples include `jquery`, `moment`, `lodash`, and many more. +Examples include [`jquery`](https://jquery.com/), [`moment`](http://momentjs.com/), [`lodash`](https://lodash.com/), and many more. ### Template There are three templates available for modules, - `module.d.ts`, `module-class.d.ts` and `module-callable.d.ts`. + [`module.d.ts`](./templates/module.d.ts), [`module-class.d.ts`](./templates/module-class.d.ts) and [`module-function.d.ts`](./templates/module-function.d.ts). -Use `module-callable.d.ts` if your module can be *called* like a function: +Use [`module-function.d.ts`](./templates/module-function.d.ts) if your module can be *called* like a function: ```ts var x = require('foo'); @@ -196,9 +196,9 @@ var x = require('foo'); var y = x(42); ``` -Be sure to read the footnote "The Impact of ES6 on Module Call Signatures" +Be sure to read the footnote ["The Impact of ES6 on Module Call Signatures"](#) -Use `module-class.d.ts` if your module can be *constructed* using `new`: +Use [`module-class.d.ts`](./templates/module-class.d.ts) if your module can be *constructed* using `new`: ```ts var x = require('bar'); @@ -208,7 +208,7 @@ var y = new x('hello'); The same footnote applies to these modules. -If your module is not callable or constructable, use the `module.d.ts` file. +If your module is not callable or constructable, use the [`module.d.ts`](./templates/module.d.ts) file. ## *Module Plugin* or *UMD Plugin* @@ -220,7 +220,7 @@ For the purposes of writing a definition file, you'll write the same code ### Template -Use the `module-plugin.d.ts` template. +Use the [`module-plugin.d.ts`](./templates/module-plugin.d.ts) template. ## *Global Plugin* @@ -247,7 +247,7 @@ console.log(y.reverseAndSort()); ### Template -Use the `global-plugin.d.ts` template. +Use the [`global-plugin.d.ts`](./templates/global-plugin.d.ts) template. ## *Global-modifying Modules* @@ -280,7 +280,7 @@ console.log(y.reverseAndSort()); ### Template -Use the `global-modifying-module.d.ts` template. +Use the [`global-modifying-module.d.ts`](./templates/global-modifying-module.d.ts) template. # Consuming Dependencies From f83215b2ddc631ab4a3d19832b65e30c8b33f041 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 3 Jul 2016 23:53:42 -0700 Subject: [PATCH 080/831] Remove unused files --- .../Adding to DefinitelyTyped.md | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 pages/declaration files/Adding to DefinitelyTyped.md diff --git a/pages/declaration files/Adding to DefinitelyTyped.md b/pages/declaration files/Adding to DefinitelyTyped.md deleted file mode 100644 index 146ec1bd5..000000000 --- a/pages/declaration files/Adding to DefinitelyTyped.md +++ /dev/null @@ -1,23 +0,0 @@ -# Creating a New DefinitelyTyped File - -This page will walk you through how to create a new folder in DefinitelyTyped. - -## Create the Folder - -Naming - -## Copy from _template - -## Rename `-tests.ts` - -## Modify tsconfig.json - -Use the template, modify files param, leave remainder untouched - -## Write Your File - -## Test for Compilation - -## Test for Conformance - -## Test for Breaks \ No newline at end of file From 80a7d6edbb5cc67c68ece2fdc7ca7fab423be3d9 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Sun, 3 Jul 2016 23:56:09 -0700 Subject: [PATCH 081/831] Remove old writing declaration files page --- pages/Writing Declaration Files.md | 268 ----------------------------- 1 file changed, 268 deletions(-) delete mode 100644 pages/Writing Declaration Files.md diff --git a/pages/Writing Declaration Files.md b/pages/Writing Declaration Files.md deleted file mode 100644 index 8b478bef0..000000000 --- a/pages/Writing Declaration Files.md +++ /dev/null @@ -1,268 +0,0 @@ -# Introduction - -When using an external JavaScript library, or new host API, you'll need to use a declaration file (.d.ts) to describe the shape of that library. -This guide covers a few high-level concepts specific to writing declaration files, then proceeds with a number of examples that show how to transcribe various concepts to their matching declaration file descriptions. - -# Guidelines and Specifics - -## Workflow - -The best way to write a .d.ts file is to start from the documentation of the library, not the code. -Working from the documentation ensures the surface you present isn't muddied with implementation details, and is typically much easier to read than JS code. -The examples below will be written as if you were reading documentation that presented example calling code. - -## Namespacing - -When defining interfaces (for example, "options" objects), you have a choice about whether to put these types inside a namespace or not. -This is largely a judgement call -- if the consumer is likely to often declare variables or parameters of that type, and the type can be named without risk of colliding with other types, prefer placing it in the global namespace. -If the type is not likely to be referenced directly, or can't be named with a reasonably unique name, do use a namespace to prevent it from colliding with other types. - -## Callbacks - -Many JavaScript libraries take a function as a parameter, then invoke that function later with a known set of arguments. -When writing the function signatures for these types, *do not* mark those parameters as optional. -The right way to think of this is *"What parameters will be provided?"*, not *"What parameters will be consumed?"*. -While TypeScript 0.9.7 and above does not enforce that the optionality, bivariance on argument optionality might be enforced by an external linter. - -## Extensibility and Declaration Merging - -When writing declaration files, it's important to remember TypeScript's rules for extending existing objects. -You might have a choice of declaring a variable using an anonymous type or an interface type: - -#### Anonymously-typed var - -```ts -declare var MyPoint: { x: number; y: number; }; -``` - -#### Interfaced-typed var - -```ts -interface SomePoint { x: number; y: number; } -declare var MyPoint: SomePoint; -``` - -From a consumption side these declarations are identical, but the type `SomePoint` can be extended through interface merging: - -```ts -interface SomePoint { z: number; } -MyPoint.z = 4; // OK -``` - -Whether or not you want your declarations to be extensible in this way is a bit of a judgement call. -As always, try to represent the intent of the library here. - -## Class Decomposition - -Classes in TypeScript create two separate types: the instance type, which defines what members an instance of a class has, and the constructor function type, which defines what members the class constructor function has. -The constructor function type is also known as the "static side" type because it includes static members of the class. - -While you can reference the static side of a class using the `typeof` keyword, it is sometimes useful or necessary when writing declaration files to use the *decomposed class* pattern which explicitly separates the instance and static types of class. - -As an example, the following two declarations are nearly equivalent from a consumption perspective: - -#### Standard - -```ts -class A { - static st: string; - inst: number; - constructor(m: any) {} -} -``` - -#### Decomposed - -```ts -interface A_Static { - new(m: any): A_Instance; - st: string; -} -interface A_Instance { - inst: number; -} -declare var A: A_Static; -``` - -The trade-offs here are as follows: - -* Standard classes can be inherited from using `extends`; decomposed classes cannot. This might change in later version of TypeScript if arbitrary `extends` expressions are allowed. -* It is possible to add members later (through declaration merging) to the static side of both standard and decomposed classes -* It is possible to add instance members to decomposed classes, but not standard classes -* You'll need to come up with sensible names for more types when writing a decomposed class - -## Naming Conventions - -In general, you shouldn't prefix interfaces with `I` (e.g. `IColor`). -Because the concept of an interface in TypeScript is much more broad than in C# or Java, the `IFoo` naming convention is not broadly useful. - -# Examples - -Let's jump in to the examples section. For each example, sample *usage* of the library is provided, followed by the declaration code that accurately types the usage. -When there are multiple good representations, more than one declaration sample might be listed. - -## Options Objects - -#### Usage - -```ts -animalFactory.create("dog"); -animalFactory.create("giraffe", { name: "ronald" }); -animalFactory.create("panda", { name: "bob", height: 400 }); -// Invalid: name must be provided if options is given -animalFactory.create("cat", { height: 32 }); -``` - -#### Typing - -```ts -namespace animalFactory { - interface AnimalOptions { - name: string; - height?: number; - weight?: number; - } - function create(name: string, animalOptions?: AnimalOptions): Animal; -} -``` - -## Functions with Properties - -#### Usage - -```ts -zooKeeper.workSchedule = "morning"; -zooKeeper(giraffeCage); -``` - -#### Typing - -```ts -// Note: Function must precede namespace -function zooKeeper(cage: AnimalCage); -namespace zooKeeper { - var workSchedule: string; -} -``` - -## New + callable methods - -#### Usage - -```ts -var w = widget(32, 16); -var y = new widget("sprocket"); -// w and y are both widgets -w.sprock(); -y.sprock(); -``` - -#### Typing - -```ts -interface Widget { - sprock(): void; -} - -interface WidgetFactory { - new(name: string): Widget; - (width: number, height: number): Widget; -} - -declare var widget: WidgetFactory; -``` - -## Global / External-agnostic Libraries - -These libraries can be used as either globals or imports. -In a module file (one with any imports/exports), using these as globals is not allowed. -These are also known as [UMD](https://github.com/umdjs/umd) modules. - -#### Usage - -```ts -// Either -import x = require("zoo"); -x.open(); -// or -zoo.open(); -``` - -#### Typing - -```ts -export function open(): void; -export as namespace zoo; -``` - -## Single Complex Object in Modules - -#### Usage - -```ts -// Super-chainable library for eagles -import Eagle = require("./eagle"); - -// Call directly -Eagle("bald").fly(); - -// Invoke with new -var eddie = new Eagle("Mille"); - -// Set properties -eddie.kind = "golden"; -``` - -#### Typing - -```ts -interface Eagle { - (kind: string): Eagle; - new (kind: string): Eagle; - - kind: string; - fly(): void -} - -declare var Eagle: Eagle; - -export = Eagle; -``` - -## Function as an Module - -This is a common pattern for modules whose imported entities are callable functions. - -#### Usage - -```ts -import sayHello = require("say-hello"); -sayHello("Travis"); -``` - -#### Typing - -```ts -declare module "say-hello" { - function sayHello(name: string): void; - export = sayHello; -} -``` - -## Callbacks - -#### Usage - -```ts -addLater(3, 4, x => console.log("x = " + x)); -``` - -#### Typing - -```ts -// Note: 'void' return type is preferred here -function addLater(x: number, y: number, callback: (sum: number) => void): void; -``` - -Please post a comment [here](https://github.com/Microsoft/TypeScript-Handbook/issues) if there's a pattern you'd like to see documented! -We'll add to this as we can. From 3c75abc18814197c0b5cf86a8da7bd3e2da34bc2 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 00:13:25 -0700 Subject: [PATCH 082/831] Remove redundant headers --- pages/declaration files/By Example.md | 24 +++++++++---------- pages/declaration files/Do's and Don'ts.md | 22 ++++++++--------- pages/declaration files/Introduction.md | 16 +++++-------- pages/declaration files/Library Structures.md | 2 +- 4 files changed, 28 insertions(+), 36 deletions(-) diff --git a/pages/declaration files/By Example.md b/pages/declaration files/By Example.md index 4dcf4f140..0418c0378 100644 --- a/pages/declaration files/By Example.md +++ b/pages/declaration files/By Example.md @@ -1,6 +1,4 @@ -# Definition Files by Example - -## Introduction +# Introduction The purpose of this guide is to teach you how to write a high-quality definition file. This guide is structured by showing an example *usage* and *documentation*, @@ -15,9 +13,9 @@ These examples are ordered in approximately increasing order of complexity. * [Reusable Types (Global)](#reusable-types-global) * [Classes](#classes) -## The Examples +# The Examples -### Global variables +## Global variables *Documentation* > The global variable `foo` contains the number of widgets present. @@ -38,7 +36,7 @@ You can also use `declare let` if the variable is block-scoped. declare var foo: number; ``` -### Global functions +## Global functions *Documentation* > You can invoke the function `greet` with a string to show a greeting to the user. @@ -57,7 +55,7 @@ Use `declare function` to declare functions. declare function greet(greeting: string): void; ``` -### Objects with Properties +## Objects with Properties *Documentation* > The global variable `myLib` has a function `makeGreeting` for creating greetings, @@ -82,7 +80,7 @@ declare namespace myLib { } ``` -### Overloaded functions +## Overloaded functions *Documentation* > The `getWidget` function accepts a number and return a Widget, or accepts a string and returns a Widget array @@ -101,7 +99,7 @@ declare function getWidget(n: number): Widget; declare function getWidget(s: string): Widget[]; ``` -### Reusable Types (interfaces) +## Reusable Types (interfaces) *Documentation* > When specifying a greeting, you must pass a GreetingSettings object. @@ -132,7 +130,7 @@ interface GreetingSettings { declare function greet(setting: GreetingSettings): void; ``` -### Reusable Types (type aliases) +## Reusable Types (type aliases) *Documentation* > Anywhere a greeting is expected, you can provide a `string`, @@ -161,7 +159,7 @@ type GreetingLike = string | (() => string) | Greeting; declare function greet(g: GreetingLike): void; ``` -### Organizing Types +## Organizing Types *Documentation* > The `greeter` object can log to a file, or display an alert. @@ -208,7 +206,7 @@ declare namespace GreetingLib.Options { } ``` -### Classes +## Classes *Documentation* > You can create a greeter by instantiating the `Greeter` object, @@ -243,7 +241,7 @@ declare class Greeter { -## Callback Types +# Callback Types -### Return Types of Callbacks +## Return Types of Callbacks @@ -63,7 +61,7 @@ function fn(x: () => void) { } ``` -### Optional Parameters in Callbacks +## Optional Parameters in Callbacks *Don't* use optional parameters in callbacks unless you really mean it: @@ -88,7 +86,7 @@ interface Fetcher { } ``` -### Overloads and Callbacks +## Overloads and Callbacks *Don't* write separate overloads that differ only on callback arity: @@ -108,9 +106,9 @@ declare function beforeAll(action: (done: DoneFn) => void, timeout?: number): vo *Why*: It's always legal for a callback to disregard a parameter, so there's no need for the shorter overload. Providing a shorter callback first allows incorrectly-typed functions to be passed in because they match the first overload. -## Function Overloads +# Function Overloads -### Ordering +## Ordering *Don't* put more general overloads before more specific overloads: @@ -139,7 +137,7 @@ var x = fn(myElem); // x: string, :) *Why*: TypeScript chooses the *first matching overload* when resolving function calls. When an earlier overload is "more general" than a later one, the later one is effectively hidden and cannot be called. -### Use Optional Parameters +## Use Optional Parameters *Don't* write several overloads that differ only in trailing parameters: @@ -188,7 +186,7 @@ var x: Moment; x.diff(something, someOtherThing ? undefined : "hour"); ``` -### Use Union Types +## Use Union Types *Don't* write overloads that differ by type in only one argument position: diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index df6dcd1de..cf742f873 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -1,24 +1,20 @@ -# .d.ts File Writing: A Complete Guide - -## Introduction - This guide is designed to teach you how to write a high-quality TypeScript Declaration File. In this guide, we'll assume basic familiarity with the TypeScript language. If you haven't already, you should read the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/basic-types.html) to familiarize yourself with basic concepts, especially types and namespaces. -## Sections +# Sections The guide is broken down into the following sections. -### Library Structures +## Library Structures The [Library Structures](./Library Structures.md) guide helps you understand common library formats and how to write a correct declaration file for each formats. If you're editing an existing file, you probably don't need to read this section. Authors of new declaration files must read this section to properly understand how the format of the library influences the writing of the declaration file. -### Do's and Don'ts +## Do's and Don'ts Many common mistakes in declaration files can be easily avoided. The [Do's and Don'ts](./Do's and Don'ts.md) section identifies common errors, @@ -26,19 +22,19 @@ The [Do's and Don'ts](./Do's and Don'ts.md) section identifies common errors, and how to fix them. Everyone should read this section to help themselves avoid common mistakes. -### By Example +## By Example Many times, we are faced with writing a declaration file when we only have examples of the underlying library to guide us. The [By Example](./By Example.md) section shows many common API patterns and how to write declarations for each of them. This guide is aimed at the TypeScript novice who may not yet be familiar with every language construct in TypeScript. -### Deep Dive +## Deep Dive For seasoned authors interested in the underlying mechanics of how declaration files work, the [Deep Dive](./Deep Dive.md) section explains many advanced concepts in declaration writing, and shows how to leverage these concepts to create cleaner and more intuitive declaration files. -### `/templates` +## `/templates` In the `templates` directory, you'll find a number of declaration files that serve as a useful starting point when writing a new file. diff --git a/pages/declaration files/Library Structures.md b/pages/declaration files/Library Structures.md index b51425004..77839c463 100644 --- a/pages/declaration files/Library Structures.md +++ b/pages/declaration files/Library Structures.md @@ -1,4 +1,4 @@ -# Structuring: Overview +# Overview Broadly speaking, the way you *structure* your definition file depends on how the library is consumed. There are many ways of offering a library for consumption in JavaScript, From 8ca34972fe39508257966e299d6f4d73c66d4603 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 10:23:55 -0700 Subject: [PATCH 083/831] Fix links --- pages/declaration files/By Example.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/pages/declaration files/By Example.md b/pages/declaration files/By Example.md index 0418c0378..96328f146 100644 --- a/pages/declaration files/By Example.md +++ b/pages/declaration files/By Example.md @@ -6,16 +6,18 @@ This guide is structured by showing an example *usage* and *documentation*, These examples are ordered in approximately increasing order of complexity. -* [Global variable](#global-variable) -* [Global function](#global-function) -* [Object with Properties](#object-with-properties) -* [Overloaded function](#overloaded-function) -* [Reusable Types (Global)](#reusable-types-global) +* [Global Variables](#global-variables) +* [Global Functions](#global-functions) +* [Objects with Properties](#objects-with-properties) +* [Overloaded Function](#overloaded-functions) +* [Reusable Types (Interfaces)](#reusable-types-interfaces) +* [Reusable Types (Type Aliases)](#reusable-types-type-aliases) +* [Organizing Types)](#organizing-types) * [Classes](#classes) # The Examples -## Global variables +## Global Variables *Documentation* > The global variable `foo` contains the number of widgets present. @@ -36,7 +38,7 @@ You can also use `declare let` if the variable is block-scoped. declare var foo: number; ``` -## Global functions +## Global Functions *Documentation* > You can invoke the function `greet` with a string to show a greeting to the user. @@ -80,7 +82,7 @@ declare namespace myLib { } ``` -## Overloaded functions +## Overloaded Functions *Documentation* > The `getWidget` function accepts a number and return a Widget, or accepts a string and returns a Widget array @@ -99,7 +101,7 @@ declare function getWidget(n: number): Widget; declare function getWidget(s: string): Widget[]; ``` -## Reusable Types (interfaces) +## Reusable Types (Interfaces) *Documentation* > When specifying a greeting, you must pass a GreetingSettings object. @@ -130,7 +132,7 @@ interface GreetingSettings { declare function greet(setting: GreetingSettings): void; ``` -## Reusable Types (type aliases) +## Reusable Types (Type Aliases) *Documentation* > Anywhere a greeting is expected, you can provide a `string`, From 04f99c3bc2786d6a05d487e3371ba6add18b0956 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 12:23:08 -0700 Subject: [PATCH 084/831] Add publishing section --- pages/declaration files/Introduction.md | 4 ++ pages/declaration files/Publishing.md | 94 +++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 pages/declaration files/Publishing.md diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index cf742f873..fcdb158ad 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -39,3 +39,7 @@ For seasoned authors interested in the underlying mechanics of how declaration f In the `templates` directory, you'll find a number of declaration files that serve as a useful starting point when writing a new file. Refer to the documentation in [Library Structures](./Library Structures.md) to figure out which template file to use. + +## Publish to npm + +The [Publishing](./Publishing.md) section explains how to publish your declaration files to an npm package, and shows how to manage your dependent packages. diff --git a/pages/declaration files/Publishing.md b/pages/declaration files/Publishing.md new file mode 100644 index 000000000..43de360d2 --- /dev/null +++ b/pages/declaration files/Publishing.md @@ -0,0 +1,94 @@ +Now that you have authored a declartion file following the steps of this guid, it is time to publish it to npm. +There are two main ways you can publish your declaration files to npm: 1. bundeling with your npm package, or 2. publishing to [@types organization](https://www.npmjs.com/~types) on npm. + +If you control the npm package you are publishing declations for, then the first approch is favoured; this way your declarations and javascript always travel togather. + +# Bundel with npm package + +You will need to indicate the main declaration file for your `package.json` file, similar to how you indicate the main `.js` file. +Set the `types` property to point to your bundled declaration file. +For example: + +```json +{ + "name": "awesome", + "author": "Vandelay Industries", + "version": "1.0.0", + "main": "./lib/main.js", + "types": "./lib/main.d.ts" +} +``` + +Note that `"typings"` is another synonum for `"types"` and can be used as well. + +Also note that if your main declaration file is named `index.d.ts` and lives at the root of the package (next to `index.js`) you do not need to mark the `"types"` property, though it is advisable to do so. + +## Dependencies + +All depenencies are managed by npm. +Make sure all the declaration packages you depend on are marked appropriatelly in the `"dependnecies"` section in your `package.json`. +For example: + +```json +{ + "name": "browserify-typescript-extension", + "author": "Vandelay Industries", + "version": "1.0.0", + "main": "./lib/main.js", + "types": "./lib/main.d.ts" + "dependnecies" : [ + "browserify": "latest", + "@types/browserify": "latest", + "typescript": "next" + ] +} +``` + +In this example this package depends on `browserify`, and `typescript`. +It does expose declarations that uses the declarations in these packages; so any user or our `browserify-typescript-extension` package needs to have these depenencies as well. + +`browserify` does not bundle its declaration files with its npm packages, thus the declaration files come from `@types/browserify`. +`typescript` however, bundles its declaration files, so no need to add additonal references. + +Note that you need to use `"dependnecies"` and not `"devDependencies"` since your declarations depend on these dependnecies. + +## Red flags + +### `/// + +*Don't* use `/// ` in your declaration files. + +```ts +/// +.... +``` + +*Do* use `/// ` instead. + +```ts +/// +.... +``` + +Make sure to revisit the [Consuming dependencies](./Library Structures.md#consuming-dependencies) section for more infromation. + +### Bundling dependent declarations + +If your type definitions depend on another package: + +* *Don't* combine it with yours, keep each in their own file. +* *Don't* copy the declarations in your package either. +* *Do* depend on the npm type declaration package. + +## Publicize your declaration file + +After publishing your declaration file with your package, make sure to add a reference to it in the [DefinitelyTyped repo external package list](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/types-2.0/notNeededPackages.json). +Adding this will allow search tool to know that your package provides its own declarations. + +TODO: more about this. + +# Publish to [@types](https://www.npmjs.com/~types) + +Packages on under the [@types](https://www.npmjs.com/~types) organization are published automatically from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) using the [types-publisher tool](https://github.com/Microsoft/types-publisher). +To get your declarations publised as an @types package, please submit a pull request to [https://github.com/DefinitelyTyped/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped). +You can find more details in the [conribution guidlines page](http://definitelytyped.org/guides/contributing.html). \ No newline at end of file From 83353e20cd219b20f36cf8c18a5d608bcbdeea39 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 12:44:59 -0700 Subject: [PATCH 085/831] fix typos --- pages/declaration files/Publishing.md | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pages/declaration files/Publishing.md b/pages/declaration files/Publishing.md index 43de360d2..18d6c4e73 100644 --- a/pages/declaration files/Publishing.md +++ b/pages/declaration files/Publishing.md @@ -1,9 +1,9 @@ -Now that you have authored a declartion file following the steps of this guid, it is time to publish it to npm. -There are two main ways you can publish your declaration files to npm: 1. bundeling with your npm package, or 2. publishing to [@types organization](https://www.npmjs.com/~types) on npm. +Now that you have authored a declaration file following the steps of this guide, it is time to publish it to npm. +There are two main ways you can publish your declaration files to npm: 1. bundling with your npm package, or 2. publishing to [@types organization](https://www.npmjs.com/~types) on npm. -If you control the npm package you are publishing declations for, then the first approch is favoured; this way your declarations and javascript always travel togather. +If you control the npm package you are publishing declarations for, then the first approach is favored; this way your declarations and JavaScript always travel together. -# Bundel with npm package +# Bundle with npm package You will need to indicate the main declaration file for your `package.json` file, similar to how you indicate the main `.js` file. Set the `types` property to point to your bundled declaration file. @@ -19,14 +19,14 @@ For example: } ``` -Note that `"typings"` is another synonum for `"types"` and can be used as well. +Note that `"typings"` is synonymous with `"types"` and can be used as well. Also note that if your main declaration file is named `index.d.ts` and lives at the root of the package (next to `index.js`) you do not need to mark the `"types"` property, though it is advisable to do so. ## Dependencies -All depenencies are managed by npm. -Make sure all the declaration packages you depend on are marked appropriatelly in the `"dependnecies"` section in your `package.json`. +All dependencies are managed by npm. +Make sure all the declaration packages you depend on are marked appropriately in the `"dependencies"` section in your `package.json`. For example: ```json @@ -36,7 +36,7 @@ For example: "version": "1.0.0", "main": "./lib/main.js", "types": "./lib/main.d.ts" - "dependnecies" : [ + "dependencies" : [ "browserify": "latest", "@types/browserify": "latest", "typescript": "next" @@ -45,12 +45,12 @@ For example: ``` In this example this package depends on `browserify`, and `typescript`. -It does expose declarations that uses the declarations in these packages; so any user or our `browserify-typescript-extension` package needs to have these depenencies as well. +It does expose declarations that uses the declarations in these packages; so any user or our `browserify-typescript-extension` package needs to have these dependencies as well. `browserify` does not bundle its declaration files with its npm packages, thus the declaration files come from `@types/browserify`. -`typescript` however, bundles its declaration files, so no need to add additonal references. +`typescript` however, bundles its declaration files, so no need to add additional references. -Note that you need to use `"dependnecies"` and not `"devDependencies"` since your declarations depend on these dependnecies. +Note that you need to use `"dependencies"` and not `"devDependencies"` since your declarations depend on these dependencies. ## Red flags @@ -70,7 +70,7 @@ Note that you need to use `"dependnecies"` and not `"devDependencies"` since you .... ``` -Make sure to revisit the [Consuming dependencies](./Library Structures.md#consuming-dependencies) section for more infromation. +Make sure to revisit the [Consuming dependencies](./Library Structures.md#consuming-dependencies) section for more information. ### Bundling dependent declarations @@ -90,5 +90,5 @@ TODO: more about this. # Publish to [@types](https://www.npmjs.com/~types) Packages on under the [@types](https://www.npmjs.com/~types) organization are published automatically from [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) using the [types-publisher tool](https://github.com/Microsoft/types-publisher). -To get your declarations publised as an @types package, please submit a pull request to [https://github.com/DefinitelyTyped/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped). -You can find more details in the [conribution guidlines page](http://definitelytyped.org/guides/contributing.html). \ No newline at end of file +To get your declarations published as an @types package, please submit a pull request to [https://github.com/DefinitelyTyped/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped). +You can find more details in the [contribution guidelines page](http://definitelytyped.org/guides/contributing.html). \ No newline at end of file From 84b218f03a91a5a0c5734224de51fb06a85b72b9 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 12:45:11 -0700 Subject: [PATCH 086/831] Add a consumption section --- pages/declaration files/Consumption.md | 32 +++++++++++++++++++++++++ pages/declaration files/Introduction.md | 4 ++++ 2 files changed, 36 insertions(+) create mode 100644 pages/declaration files/Consumption.md diff --git a/pages/declaration files/Consumption.md b/pages/declaration files/Consumption.md new file mode 100644 index 000000000..6814c96ee --- /dev/null +++ b/pages/declaration files/Consumption.md @@ -0,0 +1,32 @@ +# 1. Search + +Check out [https://aka.ms/types](https://aka.ms/types) to find the package for your favorite library. + +> Note: if the declaration file you are searching for is not present, you can always contribute one back and help out the next developer looking for it. +> Please see the DefinitelyTyped [contribution guidelines page](http://definitelytyped.org/guides/contributing.html) for details. + +# 2. Download + +Getting type declarations in TypeScript 2.0 require no tools apart from npm. + +As an example, getting the declarations for a library like lodash will be just an npm command away: + +```cmd +npm install --save-dev @types/lodash +``` + +From there you’ll be able to use lodash in your TypeScript code with no fuss. +This works for both modules and global code. + +For example, once you’ve npm install-ed your type declarations, then you can use imports and write + +```ts +import * as _ from "lodash"; +_.padStart("Hello TypeScript!", 20, " "); +``` + +or if you’re not using modules, you can just use the global variable `_` if you have a `tsconfig.json` around. + +```ts +_.padStart("Hello TypeScript!", 20, " "); +``` \ No newline at end of file diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index fcdb158ad..96b15db35 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -43,3 +43,7 @@ Refer to the documentation in [Library Structures](./Library Structures.md) to f ## Publish to npm The [Publishing](./Publishing.md) section explains how to publish your declaration files to an npm package, and shows how to manage your dependent packages. + +## Finding and Installing Declaration Files + +For JavaScrit library users, the [Finding and Installing Declaration Files](./Consumption.md) section offers two simple steps to locate and install corresponding declaration files. From 16ea13b8c73f4fc3d2ef4b2e50f09bd2840fa49f Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 12:46:56 -0700 Subject: [PATCH 087/831] Update title --- pages/declaration files/Introduction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index 96b15db35..28565ba7f 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -44,6 +44,6 @@ Refer to the documentation in [Library Structures](./Library Structures.md) to f The [Publishing](./Publishing.md) section explains how to publish your declaration files to an npm package, and shows how to manage your dependent packages. -## Finding and Installing Declaration Files +## Find and Install Declaration Files -For JavaScrit library users, the [Finding and Installing Declaration Files](./Consumption.md) section offers two simple steps to locate and install corresponding declaration files. +For JavaScrit library users, the [Find and Install Declaration Files](./Consumption.md) section offers two simple steps to locate and install corresponding declaration files. From b23581083e6470e4ca92795237e4bc1609ab479b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 4 Jul 2016 12:48:58 -0700 Subject: [PATCH 088/831] Add redirect notice --- pages/Typings for NPM Packages.md | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/pages/Typings for NPM Packages.md b/pages/Typings for NPM Packages.md index 7517336f0..8c63d4ce5 100644 --- a/pages/Typings for NPM Packages.md +++ b/pages/Typings for NPM Packages.md @@ -1,28 +1 @@ -The TypeScript compiler resolves Node module names by following the [Node.js module resolution algorithm](https://nodejs.org/api/modules.html#modules_all_together). -TypeScript can also load typings that are bundled with npm packages. -The compiler will try to discover typings for module `"foo"` using the following set of rules: - -1. Try to load the `package.json` file located in the appropriate package folder (`node_modules/foo/`). If present,read the path to the typings file described in the `"typings"` field. For example, in the following `package.json`, the compiler will resolve the typings at `node_modules/foo/lib/foo.d.ts` - - ```json - { - "name": "foo", - "author": "Vandelay Industries", - "version": "1.0.0", - "main": "./lib/foo.js", - "typings": "./lib/foo.d.ts" - } - ``` - -2. Try to load a file named `index.d.ts` located in the package folder (`node_modules/foo/`) - this file should contain typings for the package. - -The precise algorithm for module resolution can be found [here](https://github.com/Microsoft/TypeScript/issues/2338). - -### Your definition files should - -* be`.d.ts` files -* be written as external modules -* not contain triple-slash references - -The rationale is that typings should not bring new compilable items to the set of compiled files; otherwise actual implementation files in the package can be overwritten during compilation. -Additionally, **loading typings should not pollute global scope** by bringing potentially conflicting entries from different version of the same library. \ No newline at end of file +> ## This page moved to [Publishing](./declaration files/Publishing.md). \ No newline at end of file From a7dc1b4adf11094cf2df749c8e410a3505e490a3 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 09:34:57 -0700 Subject: [PATCH 089/831] Fix lint issues --- pages/Typings for NPM Packages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Typings for NPM Packages.md b/pages/Typings for NPM Packages.md index 8c63d4ce5..e991e9e43 100644 --- a/pages/Typings for NPM Packages.md +++ b/pages/Typings for NPM Packages.md @@ -1 +1 @@ -> ## This page moved to [Publishing](./declaration files/Publishing.md). \ No newline at end of file +> ## This page moved to [Publishing](./declaration files/Publishing.md) \ No newline at end of file From 53c0b4e38f56337ae224be04300b1da435830ac0 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 10:27:43 -0700 Subject: [PATCH 090/831] Remove extra paren --- pages/declaration files/By Example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/declaration files/By Example.md b/pages/declaration files/By Example.md index 96328f146..8203e89f5 100644 --- a/pages/declaration files/By Example.md +++ b/pages/declaration files/By Example.md @@ -12,7 +12,7 @@ These examples are ordered in approximately increasing order of complexity. * [Overloaded Function](#overloaded-functions) * [Reusable Types (Interfaces)](#reusable-types-interfaces) * [Reusable Types (Type Aliases)](#reusable-types-type-aliases) -* [Organizing Types)](#organizing-types) +* [Organizing Types](#organizing-types) * [Classes](#classes) # The Examples From 0751425b938ebd2567cf47bf4e41ab7f810b40f6 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 11:54:20 -0700 Subject: [PATCH 091/831] Update links --- pages/declaration files/Introduction.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index 28565ba7f..59af344d8 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -36,7 +36,7 @@ For seasoned authors interested in the underlying mechanics of how declaration f ## `/templates` -In the `templates` directory, you'll find a number of declaration files that serve as a useful starting point +In the [`templates`](./templates) directory, you'll find a number of declaration files that serve as a useful starting point when writing a new file. Refer to the documentation in [Library Structures](./Library Structures.md) to figure out which template file to use. @@ -46,4 +46,4 @@ The [Publishing](./Publishing.md) section explains how to publish your declarati ## Find and Install Declaration Files -For JavaScrit library users, the [Find and Install Declaration Files](./Consumption.md) section offers two simple steps to locate and install corresponding declaration files. +For JavaScrit library users, the [Consumption](./Consumption.md) section offers two simple steps to locate and install corresponding declaration files. From 8242822f8dd6e85e5bbb0bf376f09cedc20e660e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 15:28:44 -0700 Subject: [PATCH 092/831] hide todo comments --- pages/declaration files/Deep Dive.md | 2 +- pages/declaration files/Publishing.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/declaration files/Deep Dive.md b/pages/declaration files/Deep Dive.md index e92e6a530..2ac05fdf3 100644 --- a/pages/declaration files/Deep Dive.md +++ b/pages/declaration files/Deep Dive.md @@ -228,4 +228,4 @@ The second block creates the following name meanings: An important rule is that `export` and `import` declarations export or import *all meanings* of their targets. -TODO: Write more on that. + diff --git a/pages/declaration files/Publishing.md b/pages/declaration files/Publishing.md index 18d6c4e73..6c8888c89 100644 --- a/pages/declaration files/Publishing.md +++ b/pages/declaration files/Publishing.md @@ -85,7 +85,7 @@ If your type definitions depend on another package: After publishing your declaration file with your package, make sure to add a reference to it in the [DefinitelyTyped repo external package list](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/types-2.0/notNeededPackages.json). Adding this will allow search tool to know that your package provides its own declarations. -TODO: more about this. + # Publish to [@types](https://www.npmjs.com/~types) From 9bad0a6b4839b764ba1b5e6974d2792a60cb5dd2 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 15:30:07 -0700 Subject: [PATCH 093/831] Add redirect --- pages/Writing Declaration Files.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 pages/Writing Declaration Files.md diff --git a/pages/Writing Declaration Files.md b/pages/Writing Declaration Files.md new file mode 100644 index 000000000..56ba20ab9 --- /dev/null +++ b/pages/Writing Declaration Files.md @@ -0,0 +1 @@ +> ## This page moved to [Publishing](./declaration files/Introduction.md) \ No newline at end of file From d0e9948a41050db05bf9addbb1b84c55b79a4ed2 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 15:40:58 -0700 Subject: [PATCH 094/831] Fix links --- pages/declaration files/Library Structures.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/declaration files/Library Structures.md b/pages/declaration files/Library Structures.md index 77839c463..d57401aeb 100644 --- a/pages/declaration files/Library Structures.md +++ b/pages/declaration files/Library Structures.md @@ -82,7 +82,7 @@ However, libraries that are small and require the DOM (or have *no* dependencies ### Template The template file [`global.d.ts`](./templates/global.d.ts) defines an example library `myLib`. -Be sure to read the "Preventing Name Conflicts" footnote. +Be sure to read the ["Preventing Name Conflicts" footnote](#preventing-name-conflicts). ## *module* @@ -196,7 +196,7 @@ var x = require('foo'); var y = x(42); ``` -Be sure to read the footnote ["The Impact of ES6 on Module Call Signatures"](#) +Be sure to read the [footnote "The Impact of ES6 on Module Call Signatures"](#the-impact-of-es6-on-module-plugins) Use [`module-class.d.ts`](./templates/module-class.d.ts) if your module can be *constructed* using `new`: @@ -206,7 +206,7 @@ var x = require('bar'); var y = new x('hello'); ``` -The same footnote applies to these modules. +The same [footnote](#the-impact-of-es6-on-module-plugins) applies to these modules. If your module is not callable or constructable, use the [`module.d.ts`](./templates/module.d.ts) file. From 4170c488a7bfa2d91b48c4413a12fe309b8c0146 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 5 Jul 2016 15:42:25 -0700 Subject: [PATCH 095/831] Update By Example.md --- pages/declaration files/By Example.md | 66 ++++++++++++++++----------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/pages/declaration files/By Example.md b/pages/declaration files/By Example.md index 8203e89f5..4d3747f44 100644 --- a/pages/declaration files/By Example.md +++ b/pages/declaration files/By Example.md @@ -1,7 +1,7 @@ # Introduction The purpose of this guide is to teach you how to write a high-quality definition file. -This guide is structured by showing an example *usage* and *documentation*, +This guide is structured by showing documentation for some API, along with sample usage of that API, and explaining how to write the corresponding declaration. These examples are ordered in approximately increasing order of complexity. @@ -20,15 +20,17 @@ These examples are ordered in approximately increasing order of complexity. ## Global Variables *Documentation* + > The global variable `foo` contains the number of widgets present. *Code* ```ts -console.log('Half the number of widgets is ' + (foo / 2)); +console.log("Half the number of widgets is " + (foo / 2)); ``` *Declaration* + Use `declare var` to declare variables. If the variable is read-only, you can use `declare const`. You can also use `declare let` if the variable is block-scoped. @@ -41,12 +43,13 @@ declare var foo: number; ## Global Functions *Documentation* -> You can invoke the function `greet` with a string to show a greeting to the user. + +> You can call the function `greet` with a string to show a greeting to the user. *Code* ```ts -greet('hello, world'); +greet("hello, world"); ``` *Declaration* @@ -60,15 +63,17 @@ declare function greet(greeting: string): void; ## Objects with Properties *Documentation* + > The global variable `myLib` has a function `makeGreeting` for creating greetings, -> and a property `numberOfGreetings` indicating the number of greetings made so far. +> and a property `numberOfGreetings` indicating the number of greetings made so far. *Code* ```ts -var result = myLib.makeGreeting('hello, world'); -console.log('The computed greeting is:' + result); -var count = myLib.numberOfGreetings; +let result = myLib.makeGreeting("hello, world"); +console.log("The computed greeting is:" + result); + +let count = myLib.numberOfGreetings; ``` *Declaration* @@ -78,6 +83,7 @@ Use `declare namespace` to describe types or values accessed by dotted notation. ```ts declare namespace myLib { function makeGreeting(s: string): string; + let numberOfGreetings: number; } ``` @@ -85,13 +91,15 @@ declare namespace myLib { ## Overloaded Functions *Documentation* -> The `getWidget` function accepts a number and return a Widget, or accepts a string and returns a Widget array + +The `getWidget` function accepts a number and returns a Widget, or accepts a string and returns a Widget array. *Code* ```ts let x: Widget = getWidget(43); -let arr = getWidget('all of them'); // arr: Widget[] + +let arr: Widget[] = getWidget("all of them"); ``` *Declaration* @@ -104,7 +112,8 @@ declare function getWidget(s: string): Widget[]; ## Reusable Types (Interfaces) *Documentation* -> When specifying a greeting, you must pass a GreetingSettings object. + +> When specifying a greeting, you must pass a `GreetingSettings` object. > This object has the following properties: > - greeting: Mandatory string > - duration: Optional length of time (in milliseconds) @@ -114,14 +123,14 @@ declare function getWidget(s: string): Widget[]; ```ts greet({ - greeting: 'hello world', + greeting: "hello world", duration: 4000 }); ``` *Declaration* -Use `interface` to define a type with properties. +Use an `interface` to define a type with properties. ```ts interface GreetingSettings { @@ -129,24 +138,25 @@ interface GreetingSettings { duration?: number; color?: string; } + declare function greet(setting: GreetingSettings): void; ``` ## Reusable Types (Type Aliases) *Documentation* -> Anywhere a greeting is expected, you can provide a `string`, -> a function returning a `string`, or a `Greeter` class. + +> Anywhere a greeting is expected, you can provide a `string`, a function returning a `string`, or a `Greeter` instance. *Code* ```ts function getGreeting() { - return 'howdy'; + return "howdy"; } class MyGreeter extends Greeter { } -greet('hello'); +greet("hello"); greet(getGreeting); greet(new MyGreeter()); ``` @@ -164,15 +174,16 @@ declare function greet(g: GreetingLike): void; ## Organizing Types *Documentation* -> The `greeter` object can log to a file, or display an alert. -> You can provide LogOptions to `.log(...)` or alert options to `.alert(...)` + +> The `greeter` object can log to a file or display an alert. +> You can provide LogOptions to `.log(...)` and alert options to `.alert(...)` *Code* ```ts -const g = new Greeter('Hello'); +const g = new Greeter("Hello"); g.log({ verbose: true }); -g.alert({ modal: false, title: 'Current Greeting' }); +g.alert({ modal: false, title: "Current Greeting" }); ``` *Declaration* @@ -211,25 +222,26 @@ declare namespace GreetingLib.Options { ## Classes *Documentation* -> You can create a greeter by instantiating the `Greeter` object, -> or create a customized greeter by extending from it. + +> You can create a greeter by instantiating the `Greeter` object, or create a customized greeter by extending from it. *Code* ```ts -const myGreeter = new Greeter('hello, world'); -myGreeter.greeting = 'howdy'; +const myGreeter = new Greeter("hello, world"); +myGreeter.greeting = "howdy"; myGreeter.showGreeting(); class SpecialGreeter extends Greeter { constructor() { - super('Very special greetings'); + super("Very special greetings"); } } ``` *Declaration* -Use `declare class` to describe a class or classlike object. + +Use `declare class` to describe a class or class-like object. Classes can have properties and methods as well as a constructor. ```ts From 30897039fd20eda406d8775d5ae61af987aa0ea6 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 5 Jul 2016 15:51:38 -0700 Subject: [PATCH 096/831] Update Consumption.md --- pages/declaration files/Consumption.md | 32 +++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/pages/declaration files/Consumption.md b/pages/declaration files/Consumption.md index 6814c96ee..279d7ae85 100644 --- a/pages/declaration files/Consumption.md +++ b/pages/declaration files/Consumption.md @@ -1,32 +1,38 @@ -# 1. Search +In TypeScript 2.0, it has become significantly easier to consume declaration files, in acquiring, using, and finding them. +This page details exactly how to do all three -Check out [https://aka.ms/types](https://aka.ms/types) to find the package for your favorite library. +# Downloading -> Note: if the declaration file you are searching for is not present, you can always contribute one back and help out the next developer looking for it. -> Please see the DefinitelyTyped [contribution guidelines page](http://definitelytyped.org/guides/contributing.html) for details. - -# 2. Download +Getting type declarations in TypeScript 2.0 and above requires no tools apart from npm. -Getting type declarations in TypeScript 2.0 require no tools apart from npm. - -As an example, getting the declarations for a library like lodash will be just an npm command away: +As an example, getting the declarations for a library like lodash takes nothing more than the following command ```cmd -npm install --save-dev @types/lodash +npm install --save @types/lodash ``` +# Consuming + From there you’ll be able to use lodash in your TypeScript code with no fuss. This works for both modules and global code. -For example, once you’ve npm install-ed your type declarations, then you can use imports and write +For example, once you’ve `npm install`-ed your type declarations, you can use imports and write ```ts import * as _ from "lodash"; _.padStart("Hello TypeScript!", 20, " "); ``` -or if you’re not using modules, you can just use the global variable `_` if you have a `tsconfig.json` around. +or if you’re not using modules, you can just use the global variable `_`. ```ts _.padStart("Hello TypeScript!", 20, " "); -``` \ No newline at end of file +``` + +# Searching + +For the most part, type declaration packages should always have the same name as the package name on `npm`, but prefixed with `@types/`, + but if you need, you can check out [https://aka.ms/types](https://aka.ms/types) to find the package for your favorite library. + +> Note: if the declaration file you are searching for is not present, you can always contribute one back and help out the next developer looking for it. +> Please see the DefinitelyTyped [contribution guidelines page](http://definitelytyped.org/guides/contributing.html) for details. From 842c5663a0a47bf97ec63788b82fbc3f906b827c Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 5 Jul 2016 16:07:09 -0700 Subject: [PATCH 097/831] Update Introduction.md --- pages/declaration files/Introduction.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index 59af344d8..db9563d10 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -10,11 +10,11 @@ The guide is broken down into the following sections. ## Library Structures -The [Library Structures](./Library Structures.md) guide helps you understand common library formats and how to write a correct declaration file for each formats. +The [Library Structures](./Library Structures.md) guide helps you understand common library formats and how to write a correct declaration file for each format. If you're editing an existing file, you probably don't need to read this section. Authors of new declaration files must read this section to properly understand how the format of the library influences the writing of the declaration file. -## Do's and Don'ts +## "Do"s and "Don't"s Many common mistakes in declaration files can be easily avoided. The [Do's and Don'ts](./Do's and Don'ts.md) section identifies common errors, @@ -46,4 +46,4 @@ The [Publishing](./Publishing.md) section explains how to publish your declarati ## Find and Install Declaration Files -For JavaScrit library users, the [Consumption](./Consumption.md) section offers two simple steps to locate and install corresponding declaration files. +For JavaScript library users, the [Consumption](./Consumption.md) section offers a few simple steps to locate and install corresponding declaration files. From adc00a265815bc0b2ae6c076070c01a1abba9a90 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 5 Jul 2016 16:13:27 -0700 Subject: [PATCH 098/831] Remove folder link --- pages/declaration files/Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/declaration files/Introduction.md b/pages/declaration files/Introduction.md index db9563d10..de3cc423d 100644 --- a/pages/declaration files/Introduction.md +++ b/pages/declaration files/Introduction.md @@ -36,7 +36,7 @@ For seasoned authors interested in the underlying mechanics of how declaration f ## `/templates` -In the [`templates`](./templates) directory, you'll find a number of declaration files that serve as a useful starting point +In the `templates` directory, you'll find a number of declaration files that serve as a useful starting point when writing a new file. Refer to the documentation in [Library Structures](./Library Structures.md) to figure out which template file to use. From 646e50bcde67afb458fc5d92eafb1033fcb147d2 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 5 Jul 2016 17:52:01 -0700 Subject: [PATCH 099/831] Update Library Structures.md --- pages/declaration files/Library Structures.md | 150 ++++++++---------- 1 file changed, 66 insertions(+), 84 deletions(-) diff --git a/pages/declaration files/Library Structures.md b/pages/declaration files/Library Structures.md index d57401aeb..414e97fa5 100644 --- a/pages/declaration files/Library Structures.md +++ b/pages/declaration files/Library Structures.md @@ -1,27 +1,23 @@ # Overview -Broadly speaking, the way you *structure* your definition file depends on how the library is consumed. -There are many ways of offering a library for consumption in JavaScript, - and you'll need to write your definition file to match it. -This guide covers how to identify common library patterns, - and how to write definition files which correspond to that pattern. +Broadly speaking, the way you *structure* your declaration file depends on how the library is consumed. +There are many ways of offering a library for consumption in JavaScript, and you'll need to write your declaration file to match it. +This guide covers how to identify common library patterns, and how to write declaration files which correspond to that pattern. Each type of major library structuring pattern has a corresponding file in the [`templates`](./templates) directory. You can start with these templates to help you get going faster. # Identifying Kinds of Libraries -First, we'll review the kinds of libraries TypeScript definition files can represent. -We'll briefly show how each kind of library is *used*, - how it is *written*, - and list some example libraries from the real world. +First, we'll review the kinds of libraries TypeScript declaration files can represent. +We'll briefly show how each kind of library is *used*, how it is *written*, and list some example libraries from the real world. -Identifying the structure of a library is the first step in writing its definition file. +Identifying the structure of a library is the first step in writing its declaration file. We'll give hints on how to identify structure both based on its *usage* and its *code*. Depending on the library's documentation and organization, one might be easier than the other. We recommend using whichever is more comfortable to you. -## *global* +## Global Libraries A *global* library is one that can be accessed from the global scope (i.e. without using any form of `import`). Many libraries simply expose one or more global variables for use. @@ -31,15 +27,15 @@ For example, if you were using [jQuery](https://jquery.com/), the `$` variable c $(() => { console.log('hello!'); } ); ``` -You'll usually see guidance in the documentation of a global library of how to use the library in a script tag: +You'll usually see guidance in the documentation of a global library of how to use the library in an HTML script tag: ```html - + ``` Today, most popular globally-accessible libraries are actually written as UMD libraries (see below). UMD library documentation is hard to distinguish from global library documentation. -Before writing a global definition file, make sure the library isn't actually UMD. +Before writing a global declaration file, make sure the library isn't actually UMD. ### Identifying a Global Library from Code @@ -48,7 +44,7 @@ A global "Hello, world" library might look like this: ```js function createGreeting(s) { - return 'Hello, ' + s; + return "Hello, " + s; } ``` @@ -56,7 +52,7 @@ or like this: ```js window.createGreeting = function(s) { - return 'Hello, ' + s; + return "Hello, " + s; } ``` @@ -69,41 +65,39 @@ When looking at the code of a global library, you'll usually see: You *won't* see: * Checks for, or usage of, module loaders like `require` or `define` -* CommonJS/nodejs-style imports of the form `var fs = require('fs');` +* CommonJS/Node.js-style imports of the form `var fs = require("fs");` * Calls to `define(...)` -* Documentation describing how to `require` the library +* Documentation describing how to `require` or import the library ### Examples of Global Libraries -Because it's usually easy to turn a global library into a UMD library, - very few popular libraries are still written in the global style. +Because it's usually easy to turn a global library into a UMD library, very few popular libraries are still written in the global style. However, libraries that are small and require the DOM (or have *no* dependencies) may still be global. -### Template +### Global Library Template The template file [`global.d.ts`](./templates/global.d.ts) defines an example library `myLib`. Be sure to read the ["Preventing Name Conflicts" footnote](#preventing-name-conflicts). -## *module* +## Modular Libraries Some libraries only work in a module loader environment. -For example, because `express` only works in NodeJS, - it must be loaded using the CommonJS `require` function. +For example, because `express` only works in Node.js and must be loaded using the CommonJS `require` function. -ECMAScript 2016 (also known as ES2015, ECMAScript 6, ES6), CommonJS, and RequireJS have similar notions of *importing* a *module*. -In JavaScript CommonJS (nodejs), for example, you would write +ECMAScript 2015 (also known as ES2015, ECMAScript 6, and ES6), CommonJS, and RequireJS have similar notions of *importing* a *module*. +In JavaScript CommonJS (Node.js), for example, you would write ```ts -var fs = require('fs'); +var fs = require("fs"); ``` In TypeScript or ES6, the `import` keyword serves the same purpose: ```ts -import fs = require('fs'); +import fs = require("fs"); ``` -You'll typically see module libraries include one of these lines in their documentation: +You'll typically see modular libraries include one of these lines in their documentation: ```js var someLib = require('someLib'); @@ -117,14 +111,13 @@ define(..., ['someLib'], function(someLib) { }); ``` -As with global modules, you might see these examples in the documentation of a UMD module, - so be sure to check the code or documentation. +As with global modules, you might see these examples in the documentation of a UMD module, so be sure to check the code or documentation. ### Identifying a Module Library from Code -Module libraries will typically have at least some of the following: +Modular libraries will typically have at least some of the following: -* Unconditional calls to `require` or `define`* +* Unconditional calls to `require` or `define` * Declarations like `import * as a from 'b';` or `export c;` * Assignments to `exports` or `module.exports` @@ -132,19 +125,18 @@ They will rarely have: * Assignments to properties of `window` or `global` -### Examples of Module Libraries +### Examples of Modular Libraries -Many popular nodejs libraries are in the module family, such as [`express`](http://expressjs.com/), [`gulp`](http://gulpjs.com/), and [`request`](https://github.com/request/request). +Many popular Node.js libraries are in the module family, such as [`express`](http://expressjs.com/), [`gulp`](http://gulpjs.com/), and [`request`](https://github.com/request/request). ## *UMD* -A *UMD* module is one that can *either* be used as module (through an import), - or as a global (when run in an environment without a module loader). -Many popular libraries, such as [`moment`](http://momentjs.com/), are written this way. -For example, in nodejs, you would write: +A *UMD* module is one that can *either* be used as module (through an import), or as a global (when run in an environment without a module loader). +Many popular libraries, such as [Moment.js](http://momentjs.com/), are written this way. +For example, in Node.js or using RequireJS, you would write: ```ts -import moment = require('moment'); +import moment = require("moment"); console.log(moment.format()); ``` @@ -161,27 +153,25 @@ This is an easy-to-spot pattern that looks something like this: ```js (function (root, factory) { - if (typeof define === 'function' && define.amd) { - define(['b'], factory); - } else if (typeof module === 'object' && module.exports) { - module.exports = factory(require('b')); + if (typeof define === "function" && define.amd) { + define(["libName"], factory); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("libName")); } else { - root.returnExports = factory(root.b); + root.returnExports = factory(root.libName); } }(this, function (b) { ``` -If you see tests for `typeof define`, `typeof window`, or `typeof module` in the code of a library, - especially at the top of the file, - it's almost always a UMD library. +If you see tests for `typeof define`, `typeof window`, or `typeof module` in the code of a library, especially at the top of the file, it's almost always a UMD library. -Documentation for UMD libraries will also often demonstrate a "Using in nodejs" example showing `require` - and a "Using in browser" example showing using a ` + + + + + + +``` + +Notice that we're including files from within `node_modules`. +React and React-DOM's npm packages include standalone `.js` files that you can include in a web page, and we're referencing them directly to get things moving faster. +Feel free to copy these files to another directory, or alternatively, host them on a content delivery network (CDN). +Facebook makes CDN-hosted versions of React available, and you can [read more about that here](http://facebook.github.io/react/downloads.html#development-vs.-production-builds). + +# Create a webpack configuration file + +Create a `webpack.config.js` file at the root of the project directory. + +```js +module.exports = { + entry: "./src/index.tsx", + output: { + filename: "bundle.js", + path: __dirname + "/dist" + }, + + // Enable sourcemaps for debugging webpack's output. + devtool: "source-map", + + resolve: { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"] + }, + + module: { + loaders: [ + // All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'. + { test: /\.tsx?$/, loader: "ts-loader" } + ], + + preLoaders: [ + // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. + { test: /\.js$/, loader: "source-map-loader" } + ] + }, + + // When importing a module whose path matches one of the following, just + // assume a corresponding global variable exists and use that instead. + // This is important because it allows us to avoid bundling all of our + // dependencies, which allows browsers to cache those libraries between builds. + externals: { + "react": "React", + "react-dom": "ReactDOM" + }, +}; +``` + +You might be wondering about that `externals` field. +We want to avoid bundling all of React into the same file, since this increases compilation time and browsers will typically be able to cache a library if it doesn't change. + +Ideally, we'd just import the React module from within the browser, but most browsers still don't quite support modules yet. +Instead libraries have traditionally made themselves available using a single global variable like `jQuery` or `_`. +This is called the "namespace pattern", and webpack allows us to continue leveraging libraries written that way. +With our entry for `"react": "React"`, webpack will work its magic to make any import of `"react"` load from the `React` variable. + +You can learn more about configuring webpack [here](http://webpack.github.io/docs/configuration.html). + +# Putting it all together + +Just run: + +```shell +webpack +``` + +Now open up `index.html` in your favorite browser and everything should be ready to use! +You should see a page that says "Hello from TypeScript and React!" diff --git a/pages/tutorials/React.md b/pages/tutorials/React.md index 92d918188..0d346b524 100644 --- a/pages/tutorials/React.md +++ b/pages/tutorials/React.md @@ -26,7 +26,7 @@ We'll create a new project called `my-app`: create-react-app my-app --scripts-version=react-scripts-ts ``` -[react-scripts-ts](https://www.npmjs.com/package/react-scripts-ts) is just a set of adjustments to take the standard create-react-app project pipeline and bring TypeScript into the mix. +[react-scripts-ts](https://www.npmjs.com/package/react-scripts-ts) is a set of adjustments to take the standard create-react-app project pipeline and bring TypeScript into the mix. At this point, your project layout should more or less look something like the following: @@ -326,7 +326,7 @@ In this case we didn't need to install `@types/redux` because Redux already come ## Defining our state We need to define the shape of the state which Redux will store. -For this, we can just create a file called `src/types/index.tsx` which will contain definitions for types that we might use throughout the program. +For this, we can create a file called `src/types/index.tsx` which will contain definitions for types that we might use throughout the program. ```ts // src/types/index.tsx @@ -511,7 +511,7 @@ export function mapDispatchToProps(dispatch: Dispatch) Finally, we're ready to call `connect`. `connect` will first take `mapStateToProps` and `mapDispatchToProps`, and then return another function that we can use to wrap our component. -Our resulting container is just: +Our resulting container is defined with the following line of code: ```ts export default connect(mapStateToProps, mapDispatchToProps)(Hello); From 95fb87e06fda85204d90696bb7a9a652ca1bee04 Mon Sep 17 00:00:00 2001 From: Gert Cuykens Date: Tue, 14 Mar 2017 22:50:45 +0100 Subject: [PATCH 282/831] add example for class decorator --- pages/Decorators.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pages/Decorators.md b/pages/Decorators.md index 4c634a6f6..ecab04cb0 100644 --- a/pages/Decorators.md +++ b/pages/Decorators.md @@ -163,6 +163,28 @@ function sealed(constructor: Function) { When `@sealed` is executed, it will seal both the constructor and its prototype. +Next we have a example how to override the constructor. + +```ts +function classDecorator(constructor:T) { + return class extends constructor { + newProperty = "new property"; + hello = "override"; + } +} + +@classDecorator +class Greeter { + property = "property"; + hello: string; + constructor(m: string) { + this.hello = m; + } +} + +console.log(new Greeter("world")); +``` + ## Method Decorators A *Method Decorator* is declared just before a method declaration. From a9ee13c9733bf609ace030ccf2e78218f91819d5 Mon Sep 17 00:00:00 2001 From: Boris Serdiuk Date: Fri, 17 Mar 2017 00:17:46 +0100 Subject: [PATCH 283/831] Update link to decorators spec --- pages/Decorators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Decorators.md b/pages/Decorators.md index 4c634a6f6..f26149f8c 100644 --- a/pages/Decorators.md +++ b/pages/Decorators.md @@ -2,7 +2,7 @@ With the introduction of Classes in TypeScript and ES6, there now exist certain scenarios that require additional features to support annotating or modifying classes and class members. Decorators provide a way to add both annotations and a meta-programming syntax for class declarations and members. -Decorators are a [stage 1 proposal](https://github.com/wycats/javascript-decorators/blob/master/README.md) for JavaScript and are available as an experimental feature of TypeScript. +Decorators are a [stage 2 proposal](https://github.com/tc39/proposal-decorators) for JavaScript and are available as an experimental feature of TypeScript. > NOTE  Decorators are an experimental feature that may change in future releases. From be83734de721e49412a3e88249a44a74089d8c35 Mon Sep 17 00:00:00 2001 From: marzelin Date: Fri, 17 Mar 2017 14:09:03 +0100 Subject: [PATCH 284/831] Update info in --module compiler option Fix #428 --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 444a1a6f3..8c39aaca6 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -31,7 +31,7 @@ Option | Type | Default `--locale` | `string` | *(platform specific)* | The locale to use to show error messages, e.g. en-us. `--mapRoot` | `string` | | Specifies the location where debugger should locate map files instead of generated locations. Use this flag if the .map files will be located at run-time in a different location than the .js files. The location specified will be embedded in the sourceMap to direct the debugger where the map files will be located. `--maxNodeModuleJsDepth` | `number` | `0` | The maximum dependency depth to search under node_modules and load JavaScript files. Only applicable with `--allowJs`. -`--module`
`-m` | `string` | `target === "ES6" ? "ES6" : "CommonJS"` | Specify module code generation: `"None"`, `"CommonJS"`, `"AMD"`, `"System"`, `"UMD"`, `"ES6"`, or `"ES2015"`.
► Only `"AMD"` and `"System"` can be used in conjunction with `--outFile`.
► `"ES6"` and `"ES2015"` values may not be used when targeting `"ES5"` or lower. +`--module`
`-m` | `string` | `target === "ES6" ? "ES6" : "CommonJS"` | Specify module code generation: `"None"`, `"CommonJS"`, `"AMD"`, `"System"`, `"UMD"`, `"ES6"`, or `"ES2015"`.
► Only `"AMD"` and `"System"` can be used in conjunction with `--outFile`.
► `"ES6"` and `"ES2015"` values may be used when targeting `"ES5"` or lower to allow for tree shaking. `--moduleResolution` | `string` | `module === "AMD" | "System" | "ES6" ? "Classic" : "Node"` | Determine how modules get resolved. Either `"Node"` for Node.js/io.js style resolution, or `"Classic"`. See [Module Resolution documentation](./Module Resolution.md) for more details. `--newLine` | `string` | *(platform specific)* | Use the specified end of line sequence to be used when emitting files: `"crlf"` (windows) or `"lf"` (unix)." `--noEmit` | `boolean` | `false` | Do not emit outputs. From 61d6cd4238eed498d4a18a487a95585b0bc853a7 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 17 Mar 2017 15:00:05 -0700 Subject: [PATCH 285/831] Addressed some more feedback. --- pages/tutorials/React.md | 76 +++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/pages/tutorials/React.md b/pages/tutorials/React.md index 0d346b524..3d2511ca5 100644 --- a/pages/tutorials/React.md +++ b/pages/tutorials/React.md @@ -28,7 +28,7 @@ create-react-app my-app --scripts-version=react-scripts-ts [react-scripts-ts](https://www.npmjs.com/package/react-scripts-ts) is a set of adjustments to take the standard create-react-app project pipeline and bring TypeScript into the mix. -At this point, your project layout should more or less look something like the following: +At this point, your project layout should look like the following: ```text my-app/ @@ -58,7 +58,7 @@ Running the project is as simple as running npm run start ``` -This runs the `start` script specified in our `package.json`, and will spawn off a server reacts to updates as we save our files. +This runs the `start` script specified in our `package.json`, and will spawn off a server which reloads the page as we save our files. Typically the server runs at `http://localhost:3000`, but should be automatically opened for you. This tightens the iteration loop by allowing us to quickly preview changes. @@ -77,9 +77,9 @@ If you'd like, you can run `npm run start` and `npm run test` side by side so th # Creating a production build -When running the project (as specified earlier), we didn't end up with an optimized build. +When running the project with `npm run start`, we didn't end up with an optimized build. Typically, we want the code we ship to users to be as fast and small as possible. -Certain optimizations (like minification) can accomplish this, but often take more time. +Certain optimizations like minification can accomplish this, but often take more time. We call builds like this "production" builds (as opposed to development builds). To run a production build, just run @@ -90,7 +90,8 @@ npm run build This will create an optimized JS and CSS build in `./build/static/js` and `./build/static/css` respectively. -You won't need to run a production build most of the time, but it's often useful to do so before committing changes. +You won't need to run a production build most of the time, +but it is useful if you need to measure things like the final size of your app. # Creating a component @@ -113,7 +114,7 @@ export interface Props { enthusiasmLevel?: number; } -const Hello = ({ name, enthusiasmLevel = 1 }: Props) => { +function Hello({ name, enthusiasmLevel = 1 }: Props) { if (enthusiasmLevel <= 0) { throw new Error('You could be a little more enthusiastic. :D'); } @@ -121,7 +122,7 @@ const Hello = ({ name, enthusiasmLevel = 1 }: Props) => { return (
- Hello {name + getExclamationMarks(enthusiasmLevel)}! + Hello {name + getExclamationMarks(enthusiasmLevel)}
); @@ -132,7 +133,7 @@ export default Hello; // helpers function getExclamationMarks(numChars: number) { - return Array(numChars).join('!'); + return Array(numChars + 1).join('!'); } ``` @@ -140,13 +141,14 @@ Notice that we defined a type named `Props` that specifies the properties our co `name` is a required `string`, and `enthusiasmLevel` is an optional `number` (which you can tell from the `?` that we wrote out after its name). We also wrote `Hello` as a stateless function component (an SFC). -To be specific, `Hello` is a variable being assigned an arrow function. -That arrow function destructures a given `Props` object, and defaults `enthusiasmLevel` to `1` if it isn't defined. +To be specific, `Hello` is a function that takes a `Props` object, and destructures it. +If `enthusiasmLevel` isn't given in our `Props` object, it will default to `1`. +Writing functions is one of two primary [ways React allows us to make components]((https://facebook.github.io/react/docs/components-and-props.html#functional-and-class-components)). If we wanted, we *could* have written it out as a class as follows: ```ts -class Hello extends React.Component { +class Hello extends React.Component { render() { const { name, enthusiasmLevel = 1 } = this.props; @@ -157,7 +159,7 @@ class Hello extends React.Component { return (
- Hello {name + getExclamationMarks(enthusiasmLevel)}! + Hello {name + getExclamationMarks(enthusiasmLevel)}
); @@ -165,12 +167,12 @@ class Hello extends React.Component { } ``` -But we don't really need to think about state in this example - in fact, we specified it as `undefined` in `React.Component`, so writing an SFC tends to be shorter. +But we don't really need to think about state in this example - in fact, we specified it as `object` in `React.Component`, so writing an SFC tends to be shorter. We will revisit how to bind global application state with Redux in a bit, but local component state is more useful at the presentational level when creating generic UI elements that can be shared between libraries. -Now that we've written our component, let's replace our render of `` with a render of ``. +Now that we've written our component, let's dive into `index.tsx` and replace our render of `` with a render of ``. -First we'll import it. +First we'll import it at the top of the file: ```ts import Hello from './components/Hello.tsx'; @@ -206,7 +208,7 @@ To style our `Hello` component, we can create a CSS file at `src/components/Hell } ``` -The tools that create-react-app uses (namely, Webpack and various loaders) allow us to simply import the stylesheets we're interested in. +The tools that create-react-app uses (namely, Webpack and various loaders) allow us to import the stylesheets we're interested in. So in `src/components/Hello.tsx`, we'll add the following import. ```ts @@ -224,9 +226,10 @@ Let's reiterate what they were: We can use these requirements to write a few tests for our components. -But first, let's add our first dependency. -Enzyme is a common tool in the React ecosystem that makes it easier to write tests for how components will behave. -While we have jsdom support available to emulate how a component will act in the DOM, Enzyme makes it easier to make certain queries about our components. +But first, let's install Enzyme. +[Enzyme](http://airbnb.io/enzyme/) is a common tool in the React ecosystem that makes it easier to write tests for how components will behave. +By default, our application includes a library called jsdom to allow us to simulate the DOM and test its runtime behavior without a browser. +Enzyme is similar, but builds on jsdom and makes it easier to make certain queries about our components. Let's install it as a development-time dependency. @@ -236,10 +239,12 @@ npm install -D enzyme @types/enzyme react-addons-test-utils Notice we installed packages `enzyme` as well as `@types/enzyme`. The `enzyme` package refers to the package containing JavaScript code that actually gets run, while `@types/enzyme` is a package that contains declaration files (`.d.ts` files) so that TypeScript can understand how you can use Enzyme. +You can learn more about `@types` packages [here](https://www.typescriptlang.org/docs/handbook/declaration-files/consumption.html). + We also had to install `react-addons-test-utils`. -`enzyme` actually expects `jsdom` and `react-addons-test-utils` to be installed, but we already have the former, and the latter may be optional for older versions of React. +This is something `enzyme` expects to be installed. -Now that we've got Enzyme installed, let's start writing our test! +Now that we've got Enzyme set up, let's start writing our test! Let's create a file named `src/components/Hello.test.tsx`, adjacent to our `Hello.tsx` file from earlier. ```ts @@ -292,16 +297,15 @@ As far as a React component is concerned, data flows down through its children t As an answer, the React community relies on libraries like Redux and MobX. -[Redux](http://redux.js.org) relies on synchronizing data through a centralized immutable store of data, and updates to that data will trigger a re-renders to parts of the application. +[Redux](http://redux.js.org) relies on synchronizing data through a centralized and immutable store of data, and updates to that data will trigger a re-render our application. State is updated in an immutable fashion by sending explicit action messages which must be handled by functions called reducers. -Because of the explicit nature, it may often be easier to reason about how an action will affect the state of your program. +Because of the explicit nature, it is often be easier to reason about how an action will affect the state of your program. [MobX](https://mobx.js.org/) relies on functional reactive patterns where state is wrapped through observables and and passed through as props. -State is updated in a very natural way through traditional assignments that one would typically write in JavaScript. Keeping state fully synchronized for any observers is done by simply marking state as observable. As a nice bonus, the library is already written in TypeScript. -Both have different advantages and merits, with certain tradeoffs. +There are various merits and have tradeoffs to both. Generally Redux tends to see more widespread usage, so for the purposes of this tutorial, we'll focus on adding Redux; however, you should feel encouraged to explore both. @@ -389,7 +393,7 @@ We've created two types that describe what increment actions and decrement actio We also created a type (`EnthusiasmAction`) to describe cases where an action could be an increment or a decrement. Finally, we made two functions that actually manufacture the actions. -There's some clear boilerplate here, so you should feel free to look into libraries like [redux-actions](https://www.npmjs.com/package/redux-actions) once you've got the hang of things. +There's clearly boilerplate here, so you should feel free to look into libraries like [redux-actions](https://www.npmjs.com/package/redux-actions) once you've got the hang of things. ## Adding a reducer @@ -421,7 +425,9 @@ Notice that we're using the *object spread* (`...state`) which allows us to crea It's important that the `enthusiasmLevel` property come last, since otherwise it would be overridden by the property in our old state. You may want to write a few tests for your reducer. -It should be relatively easy. since reducers are pure functions, and can be passed arbitrary data. +Since reducers are pure functions, they can be passed arbitrary data. +For every input, reducers can tested by checking their newly produced state. +Consider looking into Jest's [toEqual](https://facebook.github.io/jest/docs/expect.html#toequalvalue) method to accomplish this. ## Making a container @@ -451,7 +457,7 @@ function Hello({ name, enthusiasmLevel = 1, onIncrement, onDecrement }: Props) { return (
- Hello {name + getExclamationMarks(enthusiasmLevel)}! + Hello {name + getExclamationMarks(enthusiasmLevel)}
@@ -562,7 +568,7 @@ const store = createStore(enthusiasm, { `store` is, as you might've guessed, our central store for our application's global state. -Next, we're going to swap our our use of `./src/components/Hello` with `./src/containers/Hello` and use react-redux's `Provider` to wire up our props with our container. +Next, we're going to swap our use of `./src/components/Hello` with `./src/containers/Hello` and use react-redux's `Provider` to wire up our props with our container. We'll import each: ```ts @@ -583,6 +589,18 @@ ReactDOM.render( Notice that `Hello` no longer needs props, since we used our `connect` function to adapt our application's state for our wrapped `Hello` component's props. +### Type assertions + +One final thing we'll point out in this section is the line `document.getElementById('root') as HTMLElement`. +This syntax is called a *type assertion*, often also just called a *cast*. +This is a useful way of telling TypeScript that you know a little more about the type than the type checker does. + +The reason we need to do so in this case is that `getElementById`'s return type is `HTMLElement | null`, meaning that it can return `null`. +We're operating under the assumption that `getElementById` will actually succeed, so we need convince TypeScript of that using the `as` syntax. + +TypeScript also has a trailing "bang" (`!`) syntax, which removes `null` and `undefined` from the prior expression. +So we *could* have written `document.getElementById('root')!`, but in this case we wanted to be a bit more explicit. + # Ejecting If at any point, you feel like there are certain customizations that the create-react-app setup has made difficult, you can always opt-out and get the various configuration options you need. From a2cfd47ed7b88a71ec867d9c4ba2496920213711 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 20 Mar 2017 10:43:44 -0700 Subject: [PATCH 286/831] Remove "to allow for tree shaking" phrase --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 8c39aaca6..34c3dc47d 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -31,7 +31,7 @@ Option | Type | Default `--locale` | `string` | *(platform specific)* | The locale to use to show error messages, e.g. en-us. `--mapRoot` | `string` | | Specifies the location where debugger should locate map files instead of generated locations. Use this flag if the .map files will be located at run-time in a different location than the .js files. The location specified will be embedded in the sourceMap to direct the debugger where the map files will be located. `--maxNodeModuleJsDepth` | `number` | `0` | The maximum dependency depth to search under node_modules and load JavaScript files. Only applicable with `--allowJs`. -`--module`
`-m` | `string` | `target === "ES6" ? "ES6" : "CommonJS"` | Specify module code generation: `"None"`, `"CommonJS"`, `"AMD"`, `"System"`, `"UMD"`, `"ES6"`, or `"ES2015"`.
► Only `"AMD"` and `"System"` can be used in conjunction with `--outFile`.
► `"ES6"` and `"ES2015"` values may be used when targeting `"ES5"` or lower to allow for tree shaking. +`--module`
`-m` | `string` | `target === "ES6" ? "ES6" : "CommonJS"` | Specify module code generation: `"None"`, `"CommonJS"`, `"AMD"`, `"System"`, `"UMD"`, `"ES6"`, or `"ES2015"`.
► Only `"AMD"` and `"System"` can be used in conjunction with `--outFile`.
► `"ES6"` and `"ES2015"` values may be used when targeting `"ES5"` or lower. `--moduleResolution` | `string` | `module === "AMD" | "System" | "ES6" ? "Classic" : "Node"` | Determine how modules get resolved. Either `"Node"` for Node.js/io.js style resolution, or `"Classic"`. See [Module Resolution documentation](./Module Resolution.md) for more details. `--newLine` | `string` | *(platform specific)* | Use the specified end of line sequence to be used when emitting files: `"crlf"` (windows) or `"lf"` (unix)." `--noEmit` | `boolean` | `false` | Do not emit outputs. From 723c06c9624e8f2124f4794ced96903819531692 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 20 Mar 2017 18:22:49 -0700 Subject: [PATCH 287/831] More updates. --- pages/tutorials/React.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/pages/tutorials/React.md b/pages/tutorials/React.md index 3d2511ca5..db9372f33 100644 --- a/pages/tutorials/React.md +++ b/pages/tutorials/React.md @@ -1,17 +1,19 @@ This quick start guide will teach you how to wire up TypeScript with [React](http://facebook.github.io/react/). By the end, you'll have +* a project with React and TypeScript * linting with [TSLint](https://github.com/palantir/tslint) -* testing with [Jest](https://facebook.github.io/jest/), and +* testing with [Jest](https://facebook.github.io/jest/) and [Enzyme](http://airbnb.io/enzyme/), and * state management with [Redux](https://github.com/reactjs/react-redux) -We'll use the [create-react-app](https://github.com/facebookincubator/create-react-app) tool to quickly get set up, and then eject to see how these tools are all put together. +We'll use the [create-react-app](https://github.com/facebookincubator/create-react-app) tool to quickly get set up. We assume that you're already using [Node.js](https://nodejs.org/) with [npm](https://www.npmjs.com/). +You may also want to get a sense of [the basics with React](https://facebook.github.io/react/docs/hello-world.html). # Install create-react-app -We're going to use the create-react-app because it sets some canonical defaults for React projects. +We're going to use the create-react-app because it sets some useful tools and canonical defaults for React projects. This is just a command-line utility to scaffold out new React projects. ```shell @@ -44,7 +46,7 @@ my-app/ Of note: -* `tsconfig.json` contains some TypeScript-specific options for our project. +* `tsconfig.json` contains TypeScript-specific options for our project. * `tslint.json` stores the settings that our linter, [TSLint](https://github.com/palantir/tslint), will use. * `package.json` contains our dependencies, as well as some shortcuts for commands we'd like to run for testing, previewing, and deploying our app. * `public` contains static assets like the HTML page we're planning to deploy to, or images. You can delete any file in this folder apart from `index.html`. @@ -208,7 +210,8 @@ To style our `Hello` component, we can create a CSS file at `src/components/Hell } ``` -The tools that create-react-app uses (namely, Webpack and various loaders) allow us to import the stylesheets we're interested in. +The tools that create-react-app uses (namely, Webpack and various loaders) allow us to just import the stylesheets we're interested in. +When our build runs, any imported `.css` files will be concatenated into an output file. So in `src/components/Hello.tsx`, we'll add the following import. ```ts @@ -295,7 +298,7 @@ On its own, React is a useful library for creating composable views. However, React doesn't come with any facility for synchronizing data between your application. As far as a React component is concerned, data flows down through its children through the props you specify on each element. -As an answer, the React community relies on libraries like Redux and MobX. +Because React on its own does not provide a built-in support for state management, the React community uses libraries like Redux and MobX. [Redux](http://redux.js.org) relies on synchronizing data through a centralized and immutable store of data, and updates to that data will trigger a re-render our application. State is updated in an immutable fashion by sending explicit action messages which must be handled by functions called reducers. @@ -305,10 +308,13 @@ Because of the explicit nature, it is often be easier to reason about how an act Keeping state fully synchronized for any observers is done by simply marking state as observable. As a nice bonus, the library is already written in TypeScript. -There are various merits and have tradeoffs to both. +There are various merits and tradeoffs to both. Generally Redux tends to see more widespread usage, so for the purposes of this tutorial, we'll focus on adding Redux; however, you should feel encouraged to explore both. +The following section may have a steep learning curve. +We strongly suggest you [familiarize yourself with Redux through its documentation](http://redux.js.org/). + ## Setting the stage for actions It doesn't make sense to add Redux unless the state of our application changes. @@ -615,6 +621,7 @@ npm run eject and you should be good to go! As a heads up, you may want to commit all your work before running an eject. +You cannot undo an eject command, so opting out is permanent without committing. # Next steps From d03e78b9c3dc4f77d24cb03ac2670ceb285f83b0 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Tue, 21 Mar 2017 07:16:47 -0700 Subject: [PATCH 288/831] Address review --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 6ce54d655..df7cfff3a 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -22,7 +22,7 @@ Option | Type | Default `--inlineSourceMap` | `boolean` | `false` | Emit a single file with source maps instead of having a separate file. `--inlineSources` | `boolean` | `false` | Emit the source alongside the sourcemaps within a single file; requires `--inlineSourceMap` or `--sourceMap` to be set. `--init` | | | Initializes a TypeScript project and creates a `tsconfig.json` file. -`--isolatedModules` | `boolean` | `false` | Transpile each file separately (similar to ts.transpile). +`--isolatedModules` | `boolean` | `false` | Transpile each file as a separate module (similar to "ts.transpileModule"). `--jsx` | `string` | `"Preserve"` | Support JSX in `.tsx` files: `"React"` or `"Preserve"`. See [JSX](./JSX.md). `--jsxFactory` | `string` | `"React.createElement"` | Specify the JSX factory function to use when targeting react JSX emit, e.g. `React.createElement` or `h`. `--lib` | `string[]`| | List of library files to be included in the compilation.
Possible values are:
► `ES5`
► `ES6`
► `ES2015`
► `ES7`
► `ES2016`
► `ES2017`
► `DOM`
► `DOM.Iterable`
► `WebWorker`
► `ScriptHost`
► `ES2015.Core`
► `ES2015.Collection`
► `ES2015.Generator`
► `ES2015.Iterable`
► `ES2015.Promise`
► `ES2015.Proxy`
► `ES2015.Reflect`
► `ES2015.Symbol`
► `ES2015.Symbol.WellKnown`
► `ES2016.Array.Include`
► `ES2017.object`
► `ES2017.SharedMemory`

Note: If `--lib` is not specified a default library is injected. The default library injected is:
► For `--target ES5`: `DOM,ES5,ScriptHost`
► For `--target ES6`: `DOM,ES6,DOM.Iterable,ScriptHost` From 22c6f1573ebff4bf290f4d076f40dfcd8fac179b Mon Sep 17 00:00:00 2001 From: Yui Date: Tue, 21 Mar 2017 08:16:30 -0700 Subject: [PATCH 289/831] Fix inconsistency in the module document --- pages/Modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Modules.md b/pages/Modules.md index 623371326..62cc82641 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -492,7 +492,7 @@ declare module "path" { } ``` -Now we can `/// ` `node.d.ts` and then load the modules using `import url = require("url");`. +Now we can `/// ` `node.d.ts` and then load the modules using `import url = require("url");` or `import * as URL from "url"`. ```ts /// From 7b1c6098677dcde29d5dbb1fb618914ca625657b Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 21 Mar 2017 17:48:22 -0700 Subject: [PATCH 290/831] More changes. --- pages/tutorials/React.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pages/tutorials/React.md b/pages/tutorials/React.md index db9372f33..695eff839 100644 --- a/pages/tutorials/React.md +++ b/pages/tutorials/React.md @@ -169,8 +169,10 @@ class Hello extends React.Component { } ``` +Classes are useful [when our component instances have some state](https://facebook.github.io/react/docs/state-and-lifecycle.html). But we don't really need to think about state in this example - in fact, we specified it as `object` in `React.Component`, so writing an SFC tends to be shorter. -We will revisit how to bind global application state with Redux in a bit, but local component state is more useful at the presentational level when creating generic UI elements that can be shared between libraries. +Local component state is more useful at the presentational level when creating generic UI elements that can be shared between libraries. +For our application's lifecycle, we will revisit how applications manage general state with Redux in a bit, Now that we've written our component, let's dive into `index.tsx` and replace our render of `` with a render of ``. @@ -333,7 +335,7 @@ npm install -S redux react-redux @types/react-redux In this case we didn't need to install `@types/redux` because Redux already comes with its own definition files (`.d.ts` files). -## Defining our state +## Defining our app's state We need to define the shape of the state which Redux will store. For this, we can create a file called `src/types/index.tsx` which will contain definitions for types that we might use throughout the program. @@ -635,4 +637,4 @@ If you want to eject at some point, you may need to know a little bit more about You can check out our [React & Webpack walkthrough here](./React & Webpack.md). At some point you might need routing. -There are several solutons, but [react-router](https://github.com/ReactTraining/react-router), and is often used in conjunction with [react-router-redux](https://github.com/reactjs/react-router-redux) for Redux projects. \ No newline at end of file +There are several solutons, but [react-router](https://github.com/ReactTraining/react-router) is probably the most popular for Redux projects, and is often used in conjunction with [react-router-redux](https://github.com/reactjs/react-router-redux). \ No newline at end of file From 2df4805f272deaf2d217823b2c2b881b48a494e4 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 27 Mar 2017 10:51:27 -0700 Subject: [PATCH 291/831] Addressed more feedback. --- pages/tutorials/React.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/pages/tutorials/React.md b/pages/tutorials/React.md index db9372f33..b092e8e7c 100644 --- a/pages/tutorials/React.md +++ b/pages/tutorials/React.md @@ -189,6 +189,18 @@ ReactDOM.render( ); ``` +## Type assertions + +One final thing we'll point out in this section is the line `document.getElementById('root') as HTMLElement`. +This syntax is called a *type assertion*, sometimes also called a *cast*. +This is a useful way of telling TypeScript that you know a little more about the type than the type checker does. + +The reason we need to do so in this case is that `getElementById`'s return type is `HTMLElement | null`, meaning that it can return `null`. +We're operating under the assumption that `getElementById` will actually succeed, so we need convince TypeScript of that using the `as` syntax. + +TypeScript also has a trailing "bang" syntax (`!`), which removes `null` and `undefined` from the prior expression. +So we *could* have written `document.getElementById('root')!`, but in this case we wanted to be a bit more explicit. + # Adding style 😎 Styling a component with our setup is easy. @@ -218,7 +230,7 @@ So in `src/components/Hello.tsx`, we'll add the following import. import './Hello.css'; ``` -# Writing tests +# Writing tests with Jest We had a certain set of assumptions about our `Hello` component. Let's reiterate what they were: @@ -367,7 +379,7 @@ export type DECREMENT_ENTHUSIASM = typeof DECREMENT_ENTHUSIASM; This `const`/`type` pattern allows us to use TypeScript's string literal types in an easily accessible & refactorable way. -Next, we'll create a set of actions and functions that can quickly create these actions in `src/actions/index.tsx`. +Next, we'll create a set of actions and functions that can create these actions in `src/actions/index.tsx`. ```ts import * as constants from '../constants' @@ -397,7 +409,7 @@ export function decrementEnthusiasm(): DecrementEnthusiasm { We've created two types that describe what increment actions and decrement actions should look like. We also created a type (`EnthusiasmAction`) to describe cases where an action could be an increment or a decrement. -Finally, we made two functions that actually manufacture the actions. +Finally, we made two functions that actually manufacture the actions which we can use instead of writing out bulky object literals. There's clearly boilerplate here, so you should feel free to look into libraries like [redux-actions](https://www.npmjs.com/package/redux-actions) once you've got the hang of things. @@ -405,6 +417,7 @@ There's clearly boilerplate here, so you should feel free to look into libraries We're ready to write our first reducer! Reducers are just functions that generate changes by creating modified copies of our application's state, but that have *no side effects*. +In other words, they're what we call *[pure functions](https://en.wikipedia.org/wiki/Pure_function)*. Our reducer will go under `src/reducers/index.tsx`. Its function will be to ensure that increments raise the enthusiasm level by 1, and that decrements reduce the enthusiasm level by 1, but that the level never falls below 1. @@ -438,9 +451,11 @@ Consider looking into Jest's [toEqual](https://facebook.github.io/jest/docs/expe ## Making a container When writing with Redux, we will often write components as well as containers. +Components are often data-agnostic, and work mostly at a presentational level. *Containers* typically wrap components and feed them any data that is necessary to display and modify state. +You can read more about this concept on [Dan Abramov's article *Presentational and Container Components*](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0). -First let's update `src/components/Hello.tsx` so that it will have a means of modifying state. +First let's update `src/components/Hello.tsx` so that it can modify state. We'll add two optional callback properties to `Props` named `onIncrement` and `onDecrement`: ```ts @@ -595,18 +610,6 @@ ReactDOM.render( Notice that `Hello` no longer needs props, since we used our `connect` function to adapt our application's state for our wrapped `Hello` component's props. -### Type assertions - -One final thing we'll point out in this section is the line `document.getElementById('root') as HTMLElement`. -This syntax is called a *type assertion*, often also just called a *cast*. -This is a useful way of telling TypeScript that you know a little more about the type than the type checker does. - -The reason we need to do so in this case is that `getElementById`'s return type is `HTMLElement | null`, meaning that it can return `null`. -We're operating under the assumption that `getElementById` will actually succeed, so we need convince TypeScript of that using the `as` syntax. - -TypeScript also has a trailing "bang" (`!`) syntax, which removes `null` and `undefined` from the prior expression. -So we *could* have written `document.getElementById('root')!`, but in this case we wanted to be a bit more explicit. - # Ejecting If at any point, you feel like there are certain customizations that the create-react-app setup has made difficult, you can always opt-out and get the various configuration options you need. From f583017740b69800c524373a0f9e39dd9b3a19f1 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 27 Mar 2017 14:29:57 -0700 Subject: [PATCH 292/831] Remove accidentally added file. --- pages/tutorials/Express.md | 225 ------------------------------------- 1 file changed, 225 deletions(-) delete mode 100644 pages/tutorials/Express.md diff --git a/pages/tutorials/Express.md b/pages/tutorials/Express.md deleted file mode 100644 index 54b73a7a1..000000000 --- a/pages/tutorials/Express.md +++ /dev/null @@ -1,225 +0,0 @@ -This quick start guide will teach you how to wire up TypeScript with [Express 4](http://facebook.github.io/react/). - -# Lay out the project - -Let's start out with a new directory. -We'll name it `proj` for now, but you can change it to whatever you want. - -```shell -mkdir proj -cd proj -``` - -To start, we're going to structure our project in the following way: - -```text -proj/ - ├─ src/ - | └─ components/ - | - └─ lib/ -``` - -TypeScript files will start out in your `src` folder, run through the TypeScript compiler, and end up in the `lib` directory. - -Let's scaffold this out: - -```shell -mkdir src -mkdir lib -``` - -# Initialize the project - -Now we'll turn this folder into an npm package. - -```shell -npm init -``` - -You'll be given a series of prompts. -Unless you're planning to publish this, you can use the defaults except for your entry point. -You can always go back and change these in the `package.json` file that's been generated for you. - -# Install our dependencies - -Let's install our dependencies to get going: - -```shell -npm install --save express @types/express -``` - -That `@types/` prefix means that we also want to get the declaration files for Express. -Usually when you import a path like `"express"`, Node will look inside of the `express` package itself; -however, not all packages include declaration files, so TypeScript looks in both a package named `@types/express` as well as the `express` package. -You'll see that we won't even have to think about this later on. - -Next, we'll add development-time dependencies on TypeScript. - -```shell -npm install --save-dev typescript -``` - -Both of these dependencies will let TypeScript and webpack play well together. -ts-loader helps webpack compile your TypeScript code using the TypeScript's standard configuration file named `tsconfig.json`. -source-map-loader uses any sourcemap outputs from TypeScript to inform webpack when generating *its own* sourcemaps. -This will allow you to debug your final output file as if you were debugging your original TypeScript source code. - -Linking TypeScript allows ts-loader to use your global installation of TypeScript instead of needing a separate local copy. -If you want a local copy, just run `npm install typescript`. - -# Add a TypeScript configuration file - -You'll want to bring your TypeScript files together - both the code you'll be writing as well as any necessary declaration files. - -To do this, you'll need to create a `tsconfig.json` which contains a list of your input files as well as all your compilation settings. -Simply create a new file in your project root named `tsconfig.json` and fill it with the following contents: - -```json -{ - "compilerOptions": { - "outDir": "./dist/", - "sourceMap": true, - "noImplicitAny": true, - "module": "commonjs", - "target": "es5", - "jsx": "react" - }, - "files": [ - "./src/components/Hello.tsx", - "./src/index.tsx" - ] -} -``` - -You can learn more about `tsconfig.json` files [here](../../tsconfig.json.md). - -# Write some code - -Let's write our first TypeScript file using React. -First, create a file named `Hello.tsx` in `src/components` and write the following: - -```ts -import * as React from "react"; - -export interface HelloProps { compiler: string; framework: string; } - -export class Hello extends React.Component { - render() { - return

Hello from {this.props.compiler} and {this.props.framework}!

; - } -} -``` - -Note that while this example is quite *classy*, we didn't need to use a class. -Other methods of using React (like [stateless functional components](https://facebook.github.io/react/docs/reusable-components.html#stateless-functions)) should work just as well. - -Next, let's create an `index.tsx` in `src` with the following source: - -```ts -import * as React from "react"; -import * as ReactDOM from "react-dom"; - -import { Hello } from "./components/Hello"; - -ReactDOM.render( - , - document.getElementById("example") -); -``` - -We just imported our `Hello` component into `index.tsx`. -Notice that unlike with `"react"` or `"react-dom"`, we used a *relative path* to `Hello.tsx` - this is important. -If we hadn't, TypeScript would've instead tried looking in our `node_modules` folder. - -We'll also need a page to display our `Hello` component. -Create a file at the root of `proj` named `index.html` with the following contents: - -```html - - - - - Hello React! - - -
- - - - - - - - - -``` - -Notice that we're including files from within `node_modules`. -React and React-DOM's npm packages include standalone `.js` files that you can include in a web page, and we're referencing them directly to get things moving faster. -Feel free to copy these files to another directory, or alternatively, host them on a content delivery network (CDN). -Facebook makes CDN-hosted versions of React available, and you can [read more about that here](http://facebook.github.io/react/downloads.html#development-vs.-production-builds). - -# Create a webpack configuration file - -Create a `webpack.config.js` file at the root of the project directory. - -```js -module.exports = { - entry: "./src/index.tsx", - output: { - filename: "bundle.js", - path: __dirname + "/dist" - }, - - // Enable sourcemaps for debugging webpack's output. - devtool: "source-map", - - resolve: { - // Add '.ts' and '.tsx' as resolvable extensions. - extensions: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"] - }, - - module: { - loaders: [ - // All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'. - { test: /\.tsx?$/, loader: "ts-loader" } - ], - - preLoaders: [ - // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. - { test: /\.js$/, loader: "source-map-loader" } - ] - }, - - // When importing a module whose path matches one of the following, just - // assume a corresponding global variable exists and use that instead. - // This is important because it allows us to avoid bundling all of our - // dependencies, which allows browsers to cache those libraries between builds. - externals: { - "react": "React", - "react-dom": "ReactDOM" - }, -}; -``` - -You might be wondering about that `externals` field. -We want to avoid bundling all of React into the same file, since this increases compilation time and browsers will typically be able to cache a library if it doesn't change. - -Ideally, we'd just import the React module from within the browser, but most browsers still don't quite support modules yet. -Instead libraries have traditionally made themselves available using a single global variable like `jQuery` or `_`. -This is called the "namespace pattern", and webpack allows us to continue leveraging libraries written that way. -With our entry for `"react": "React"`, webpack will work its magic to make any import of `"react"` load from the `React` variable. - -You can learn more about configuring webpack [here](http://webpack.github.io/docs/configuration.html). - -# Putting it all together - -Just run: - -```shell -webpack -``` - -Now open up `index.html` in your favorite browser and everything should be ready to use! -You should see a page that says "Hello from TypeScript and React!" From f352e294fe2033f29d67bed4d116bc128ae981bc Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 27 Mar 2017 14:48:20 -0700 Subject: [PATCH 293/831] Addressed feedback. --- pages/tutorials/React.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/pages/tutorials/React.md b/pages/tutorials/React.md index f7d43da16..99a3db896 100644 --- a/pages/tutorials/React.md +++ b/pages/tutorials/React.md @@ -172,7 +172,7 @@ class Hello extends React.Component { Classes are useful [when our component instances have some state](https://facebook.github.io/react/docs/state-and-lifecycle.html). But we don't really need to think about state in this example - in fact, we specified it as `object` in `React.Component`, so writing an SFC tends to be shorter. Local component state is more useful at the presentational level when creating generic UI elements that can be shared between libraries. -For our application's lifecycle, we will revisit how applications manage general state with Redux in a bit, +For our application's lifecycle, we will revisit how applications manage general state with Redux in a bit. Now that we've written our component, let's dive into `index.tsx` and replace our render of `` with a render of ``. @@ -195,10 +195,11 @@ ReactDOM.render( One final thing we'll point out in this section is the line `document.getElementById('root') as HTMLElement`. This syntax is called a *type assertion*, sometimes also called a *cast*. -This is a useful way of telling TypeScript that you know a little more about the type than the type checker does. +This is a useful way of telling TypeScript what the real type of an expression is when you know better than the type checker. -The reason we need to do so in this case is that `getElementById`'s return type is `HTMLElement | null`, meaning that it can return `null`. -We're operating under the assumption that `getElementById` will actually succeed, so we need convince TypeScript of that using the `as` syntax. +The reason we need to do so in this case is that `getElementById`'s return type is `HTMLElement | null`. +Put simply, `getElementById` returns `null` when it can't find an element with a given `id`. +We're assuming that `getElementById` will actually succeed, so we need convince TypeScript of that using the `as` syntax. TypeScript also has a trailing "bang" syntax (`!`), which removes `null` and `undefined` from the prior expression. So we *could* have written `document.getElementById('root')!`, but in this case we wanted to be a bit more explicit. @@ -312,11 +313,11 @@ On its own, React is a useful library for creating composable views. However, React doesn't come with any facility for synchronizing data between your application. As far as a React component is concerned, data flows down through its children through the props you specify on each element. -Because React on its own does not provide a built-in support for state management, the React community uses libraries like Redux and MobX. +Because React on its own does not provide built-in support for state management, the React community uses libraries like Redux and MobX. -[Redux](http://redux.js.org) relies on synchronizing data through a centralized and immutable store of data, and updates to that data will trigger a re-render our application. +[Redux](http://redux.js.org) relies on synchronizing data through a centralized and immutable store of data, and updates to that data will trigger a re-render of our application. State is updated in an immutable fashion by sending explicit action messages which must be handled by functions called reducers. -Because of the explicit nature, it is often be easier to reason about how an action will affect the state of your program. +Because of the explicit nature, it is often easier to reason about how an action will affect the state of your program. [MobX](https://mobx.js.org/) relies on functional reactive patterns where state is wrapped through observables and and passed through as props. Keeping state fully synchronized for any observers is done by simply marking state as observable. @@ -379,7 +380,7 @@ export const DECREMENT_ENTHUSIASM = 'DECREMENT_ENTHUSIASM'; export type DECREMENT_ENTHUSIASM = typeof DECREMENT_ENTHUSIASM; ``` -This `const`/`type` pattern allows us to use TypeScript's string literal types in an easily accessible & refactorable way. +This `const`/`type` pattern allows us to use TypeScript's string literal types in an easily accessible and refactorable way. Next, we'll create a set of actions and functions that can create these actions in `src/actions/index.tsx`. @@ -626,7 +627,7 @@ npm run eject and you should be good to go! As a heads up, you may want to commit all your work before running an eject. -You cannot undo an eject command, so opting out is permanent without committing. +You cannot undo an eject command, so opting out is permanent unless you can recover from a commit prior to running an eject. # Next steps From e19c4286f24e311c546fc6fcc53f2896910659d3 Mon Sep 17 00:00:00 2001 From: Tomasz Magulski Date: Wed, 29 Mar 2017 21:10:04 +0200 Subject: [PATCH 294/831] Missing and misplaced semicolons --- pages/Basic Types.md | 12 ++++++------ pages/Functions.md | 2 +- pages/Variable Declarations.md | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index 73f5e79fd..ec111a5d2 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -43,14 +43,14 @@ let fullName: string = `Bob Bobbington`; let age: number = 37; let sentence: string = `Hello, my name is ${ fullName }. -I'll be ${ age + 1 } years old next month.` +I'll be ${ age + 1 } years old next month.`; ``` This is equivalent to declaring `sentence` like so: ```ts let sentence: string = "Hello, my name is " + fullName + ".\n\n" + - "I'll be " + (age + 1) + " years old next month." + "I'll be " + (age + 1) + " years old next month."; ``` # Array @@ -108,7 +108,7 @@ A helpful addition to the standard set of datatypes from JavaScript is the `enum As in languages like C#, an enum is a way of giving more friendly names to sets of numeric values. ```ts -enum Color {Red, Green, Blue}; +enum Color {Red, Green, Blue} let c: Color = Color.Green; ``` @@ -117,14 +117,14 @@ You can change this by manually setting the value of one of its members. For example, we can start the previous example at `1` instead of `0`: ```ts -enum Color {Red = 1, Green, Blue}; +enum Color {Red = 1, Green, Blue} let c: Color = Color.Green; ``` Or, even manually set all the values in the enum: ```ts -enum Color {Red = 1, Green = 2, Blue = 4}; +enum Color {Red = 1, Green = 2, Blue = 4} let c: Color = Color.Green; ``` @@ -132,7 +132,7 @@ A handy feature of enums is that you can also go from a numeric value to the nam For example, if we had the value `2` but weren't sure what that mapped to in the `Color` enum above, we could look up the corresponding name: ```ts -enum Color {Red = 1, Green, Blue}; +enum Color {Red = 1, Green, Blue} let colorName: string = Color[2]; alert(colorName); diff --git a/pages/Functions.md b/pages/Functions.md index ff8bfe31f..b13a0ff22 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -357,7 +357,7 @@ class Handler { onClickBad(this: Handler, e: Event) { // oops, used this here. using this callback would crash at runtime this.info = e.message; - }; + } } let h = new Handler(); uiElement.addClickListener(h.onClickBad); // error! diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index e2e0cc6ef..9c8821e4a 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -505,7 +505,7 @@ let o = { a: "foo", b: 12, c: "bar" -} +}; let { a, b } = o; ``` @@ -594,9 +594,9 @@ Remember that `C` was defined with `b` optional: function f({ a, b = 0 } = { a: "" }): void { // ... } -f({ a: "yes" }) // ok, default b = 0 -f() // ok, default to { a: "" }, which then defaults b = 0 -f({}) // error, 'a' is required if you supply an argument +f({ a: "yes" }); // ok, default b = 0 +f(); // ok, default to { a: "" }, which then defaults b = 0 +f({}); // error, 'a' is required if you supply an argument ``` Use destructuring with care. From 229647995bf8149ab1a9726f5a56d019021ba53f Mon Sep 17 00:00:00 2001 From: Lifu Huang Date: Sat, 1 Apr 2017 15:39:07 -0700 Subject: [PATCH 295/831] Correct a typo --- pages/Type Compatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index 92f88bf41..414c432c1 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -138,7 +138,7 @@ listenEvent(EventType.Mouse, (e: number) => console.log(e)); ## Optional Parameters and Rest Parameters When comparing functions for compatibility, optional and required parameters are interchangeable. -Extra optional parameters of the source type are not an error, and optional parameters of the target type without corresponding parameters in the target type are not an error. +Extra optional parameters of the source type are not an error, and optional parameters of the target type without corresponding parameters in the source type are not an error. When a function has a rest parameter, it is treated as if it were an infinite series of optional parameters. From 703bb135a13bb2e8886a97cfe4b3d61e82a09ced Mon Sep 17 00:00:00 2001 From: Lifu Huang Date: Sat, 1 Apr 2017 16:32:11 -0700 Subject: [PATCH 296/831] Correct a mistake in the original text Every protected/private member in target type must exist in the source instance, not the other way around. --- pages/Type Compatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index 92f88bf41..01ed4190c 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -202,7 +202,7 @@ s = a; //OK ## Private and protected members in classes Private and protected members in a class affect their compatibility. -When an instance of a class is checked for compatibility, if the instance contains a private member, then the target type must also contain a private member that originated from the same class. +When an instance of a class is checked for compatibility, if the target type contains a private member, then the instance must also contain a private member that originated from the same class. Likewise, the same applies for an instance with a protected member. This allows a class to be assignment compatible with its super class, but *not* with classes from a different inheritance hierarchy which otherwise have the same shape. From 561359bc98a3103b1dd8751f9aeb5e51e54b85c3 Mon Sep 17 00:00:00 2001 From: Aluan Haddad Date: Sun, 2 Apr 2017 22:41:58 -0400 Subject: [PATCH 297/831] Resolves #483 Clarified and expanded section on rootDirs. Added series of relatively minor expansions to clarify aspects of `rootDirs`, especially its capabilities, limitations, and its interaction with logically related features. Added a simple example to demonstrate abitrary path merging in relative module specifers. Clarified interaction (or lack there of) with paths. Clarify interation with --moduleResolution. --- pages/Module Resolution.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index ba75a98bb..85f50cd1c 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -319,6 +319,41 @@ So following our example, the `tsconfig.json` file should look like: Every time the compiler sees a relative module import in a subfolder of one of the `rootDirs`, it will attempt to look for this import in each of the entries of `rootDirs`. +The flexibility of `rootDirs` is not limited to specifying a list of physical source directories that are logically merged. The supplied array may include any number of ad hoc, arbitrary directory names, regardless of whether they exist or not. This allows the compiler to capture sophisticated bundling and runtime features such as conditional inclusion and project specific loader plugins in a in a type safe way. + +Consider an internationalization scenario where a build tool automatically generates locale specific bundles by interpolating a special path token, say `#{locale}`, as part of a relative module path such as `./#{locale}/messages`. In this hypothetical setup the tool enumerates supported locales, mapping the abstracted path into `./zh/messages`, `./de/messages`, and so forth. + +Assume that each of these modules exports an array of strings. For example `./zh/messages` might contain: + +```ts +export default [ + "您好吗", + "很高兴认识你" +]; +``` + +By leveraging `rootDirs` we can inform the compiler of this mapping and thereby allow it to safely resolve `./#{locale}/messages`, even though the directory will never exist. For example, with the following `tsconfig.json`: + +```json +{ + "compilerOptions": { + "rootDirs": [ + "src/zh", + "src/de", + "src/#{locale}" + ] + } +} +``` + +The compiler will now resolve `import messages from './#{locale}/messages'` to `import messages from './zh/messages'` for tooling purposes, allowing development in a locale agnostic manner without compromising design time support. + +#### Interaction with other module resolution options + +`rootDirs` configuration only applies to literally relative imports such as `import home from "./src/views/home"`. It has no interaction with `paths` even when the latter feature has been used to map absolute imports to what would otherwise be relative ones. For example `rootDirs` ceases to apply if we changed the previous import to `import home from "views/home"` by mapping `views/*` to `src/views/*` via `paths`. + +`rootDirs` _is_ impacted by the `moduleResolution` setting with `node` and `classic` exhibiting their respective behaviors and resolving `./module/index` and `./module/module` as expected. + ## Tracing module resolution As discussed earlier, the compiler can visit files outside the current folder when resolving a module. From 41b08719673899bf97d3a86f9f3074523b1a1e77 Mon Sep 17 00:00:00 2001 From: David Herges Date: Tue, 4 Apr 2017 08:34:09 +0200 Subject: [PATCH 298/831] feat: paths mapping relative to baseUrl --- pages/Module Resolution.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index ba75a98bb..e2b1074a9 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -215,12 +215,16 @@ Here is an example for how to specify the `"paths"` property for `jquery`. "compilerOptions": { "baseUrl": ".", // This must be specified if "paths" is. "paths": { - "jquery": ["node_modules/jquery/dist/jquery"] + "jquery": ["node_modules/jquery/dist/jquery"] // This mapping is relative to "baseUrl" } } } ``` +Please notice that `"paths"` are resolved relative to `"baseUrl"`. +When setting `"baseUrl"` to another value than `"."`, i.e. the directory of `tsconfig.json`, the mappings must be changed accordingly. +Say, you set `"baseUrl": "./src"` in the above example, then jquery should be mapped to `"../node_modules/jquery/dist/jquery"`. + Using `"paths"` also allows for more sophisticated mappings including multiple fall back locations. Consider a project configuration where only some modules are available in one location, and the rest are in another. A build step would put them all together in one place. From 78eb3a565707ac88c79816eb91fa7b1aee7aa9f8 Mon Sep 17 00:00:00 2001 From: Ryan Cormack Date: Wed, 5 Apr 2017 10:45:02 +0100 Subject: [PATCH 299/831] Updated DefinitelyTyped url for React DefinitelyTyped has all its typings under a 'typed' folder at the root of the project. Changed the url to the React typings so it goes to the new, correct, location --- pages/JSX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/JSX.md b/pages/JSX.md index b28aa634a..638b991dd 100644 --- a/pages/JSX.md +++ b/pages/JSX.md @@ -266,7 +266,7 @@ var a =
# React integration -To use JSX with React you should use the [React typings](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/react). +To use JSX with React you should use the [React typings](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react). These typings define the `JSX` namespace appropriately for use with React. ```ts From dc87c017184f7ef8708b4f02f38769249c39ec2f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 7 Apr 2017 10:01:05 -0600 Subject: [PATCH 300/831] Just Angular. It's cleaner. --- pages/tutorials/{Angular 2.md => Angular.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pages/tutorials/{Angular 2.md => Angular.md} (100%) diff --git a/pages/tutorials/Angular 2.md b/pages/tutorials/Angular.md similarity index 100% rename from pages/tutorials/Angular 2.md rename to pages/tutorials/Angular.md From 5dfeb0c9a70cefcc7309b237ee940a532494e5ba Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 7 Apr 2017 10:09:59 -0600 Subject: [PATCH 301/831] Updated text. --- pages/tutorials/Angular.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pages/tutorials/Angular.md b/pages/tutorials/Angular.md index ccb43c51c..cee747fc4 100644 --- a/pages/tutorials/Angular.md +++ b/pages/tutorials/Angular.md @@ -1,6 +1,6 @@ -Angular 2 is an upcoming framework built in TypeScript. -Using TypeScript with Angular is fairly easy to set up for this reason, as TypeScript fits right in. -The Angular team also supports TypeScript as a first-class citizen in their documentation. +Angular is a modern framework built entirely in TypeScript, and as a result, using TypeScript with Angular provides a seamless experience. -As a result, [Angular 2's site](https://angular.io) will always be the most up-to-date reference for using Angular with TypeScript. -Check out their [quick start guide here](https://angular.io/docs/ts/latest/quickstart.html) to start learning now! \ No newline at end of file +The Angular documentation not only supports TypeScript as a first-class citizen, but uses it as its primary language. +With this in mind, [Angular's site](https://angular.io) will always be the most up-to-date reference for using Angular with TypeScript. + +Check out the [quick start guide here](https://angular.io/docs/ts/latest/quickstart.html) to start learning Angular now! \ No newline at end of file From 70636566aae1da0670e29c3ad265306d50fd0a2c Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Tue, 11 Apr 2017 19:20:15 -0700 Subject: [PATCH 302/831] URL escape link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f938c9662..e319295fb 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,6 @@ [![Build Status](https://travis-ci.org/Microsoft/TypeScript-Handbook.svg)](https://travis-ci.org/Microsoft/TypeScript-Handbook) The TypeScript Handbook is a comprehensive guide to the TypeScript language. -It is meant to be read online at [the TypeScript website](https://www.typescriptlang.org/docs/handbook/basic-types.html) or [directly from this repository](./pages/Basic Types.md). +It is meant to be read online at [the TypeScript website](https://www.typescriptlang.org/docs/handbook/basic-types.html) or [directly from this repository](./pages/Basic%20Types.md). For a more formal description of the language, see the [latest TypeScript Language Specification](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md). From e39e4f1383d4304fbd20c8d47f7ea52f668e4cde Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 13 Apr 2017 09:27:01 -0700 Subject: [PATCH 303/831] use `source type` instead of `instance` --- pages/Type Compatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index 01ed4190c..8fa07cda4 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -202,7 +202,7 @@ s = a; //OK ## Private and protected members in classes Private and protected members in a class affect their compatibility. -When an instance of a class is checked for compatibility, if the target type contains a private member, then the instance must also contain a private member that originated from the same class. +When an instance of a class is checked for compatibility, if the target type contains a private member, then the source type must also contain a private member that originated from the same class. Likewise, the same applies for an instance with a protected member. This allows a class to be assignment compatible with its super class, but *not* with classes from a different inheritance hierarchy which otherwise have the same shape. From e50f72c948bd2a528d1fb4fd566aaa8bb23f6b53 Mon Sep 17 00:00:00 2001 From: Aluan Haddad Date: Thu, 13 Apr 2017 18:16:38 -0400 Subject: [PATCH 304/831] Address PR Feedback I have removed the extraneous material. --- pages/Module Resolution.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pages/Module Resolution.md b/pages/Module Resolution.md index 378fea8e4..1d8b687c9 100644 --- a/pages/Module Resolution.md +++ b/pages/Module Resolution.md @@ -352,12 +352,6 @@ By leveraging `rootDirs` we can inform the compiler of this mapping and thereby The compiler will now resolve `import messages from './#{locale}/messages'` to `import messages from './zh/messages'` for tooling purposes, allowing development in a locale agnostic manner without compromising design time support. -#### Interaction with other module resolution options - -`rootDirs` configuration only applies to literally relative imports such as `import home from "./src/views/home"`. It has no interaction with `paths` even when the latter feature has been used to map absolute imports to what would otherwise be relative ones. For example `rootDirs` ceases to apply if we changed the previous import to `import home from "views/home"` by mapping `views/*` to `src/views/*` via `paths`. - -`rootDirs` _is_ impacted by the `moduleResolution` setting with `node` and `classic` exhibiting their respective behaviors and resolving `./module/index` and `./module/module` as expected. - ## Tracing module resolution As discussed earlier, the compiler can visit files outside the current folder when resolving a module. From 0580f3ae39f6880b2f7f50eb3825887a4ad36767 Mon Sep 17 00:00:00 2001 From: Nathan Francy Date: Mon, 17 Apr 2017 21:11:11 -0500 Subject: [PATCH 305/831] 'constructor' typo in migration from javascript tutorial --- pages/tutorials/Migrating from JavaScript.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/Migrating from JavaScript.md b/pages/tutorials/Migrating from JavaScript.md index 3872a0065..b089abd0e 100644 --- a/pages/tutorials/Migrating from JavaScript.md +++ b/pages/tutorials/Migrating from JavaScript.md @@ -391,7 +391,7 @@ For instance, imagine a `Point` class, and imagine a function that we wish to ad ```ts class Point { - constuctor(public x, public y) {} + constructor(public x, public y) {} getDistance(p: Point) { let dx = p.x - this.x; let dy = p.y - this.y; From 0aa6892cf308a64a37c62d906ceb661142a760dc Mon Sep 17 00:00:00 2001 From: Dallon Feldner Date: Wed, 19 Apr 2017 10:38:31 -0500 Subject: [PATCH 306/831] Clarifies Mapped Types and additional members Resolves https://github.com/Microsoft/TypeScript-Handbook/issues/540 --- pages/Advanced Types.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 17a5a5c58..5b5044af1 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -796,6 +796,24 @@ type PersonPartial = Partial; type ReadonlyPerson = Readonly; ``` +Note that this syntax describes a type rather than a member. You **cannot** add additional members directly to a mapped typed: + +```ts +type PartialWithNewMember = { + [P in keyof T]?: T[P]; + // This is an error + newMember: boolean; +} +``` + +Although you can use union types for a similar effect: + +```ts +type PartialWithNewMember = { + [P in keyof T]?: T[P]; +} & { newMember: boolean } +``` + Let's take a look at the simplest mapped type and its parts: ```ts From abd83d8e7ded9c935762bc3eafeda40ec196ceeb Mon Sep 17 00:00:00 2001 From: Nahuel Greco Date: Wed, 19 Apr 2017 15:07:20 -0300 Subject: [PATCH 307/831] fixed invalid "import let" --- pages/Modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Modules.md b/pages/Modules.md index 62cc82641..df1a670b2 100644 --- a/pages/Modules.md +++ b/pages/Modules.md @@ -221,7 +221,7 @@ TypeScript supports `export =` to model the traditional CommonJS and AMD workflo The `export =` syntax specifies a single object that is exported from the module. This can be a class, interface, namespace, function, or enum. -When importing a module using `export =`, TypeScript-specific `import let = require("module")` must be used to import the module. +When importing a module using `export =`, TypeScript-specific `import module = require("module")` must be used to import the module. ##### ZipCodeValidator.ts From 8fa5bca6bb1b2174664bae3f046d706751ad16fc Mon Sep 17 00:00:00 2001 From: Dallon Feldner Date: Wed, 19 Apr 2017 14:52:38 -0500 Subject: [PATCH 308/831] Update Advanced Types.md Feedback from pull request: * Use "intersection type" instead of "union type" * Show the correct way of doing it first, de-emphasizing the negative example --- pages/Advanced Types.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 5b5044af1..26dce4006 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -796,22 +796,20 @@ type PersonPartial = Partial; type ReadonlyPerson = Readonly; ``` -Note that this syntax describes a type rather than a member. You **cannot** add additional members directly to a mapped typed: +Note that this syntax describes a type rather than a member. If you want to add additional members, use an intersection type: ```ts +// Use this type PartialWithNewMember = { [P in keyof T]?: T[P]; - // This is an error - newMember: boolean; -} -``` - -Although you can use union types for a similar effect: +} & { newMember: boolean } -```ts +// Instead of this: type PartialWithNewMember = { [P in keyof T]?: T[P]; -} & { newMember: boolean } + // This is an error + newMember: boolean; +} ``` Let's take a look at the simplest mapped type and its parts: From df26a5c7042d2d552a91026e5bc645444fd310fd Mon Sep 17 00:00:00 2001 From: Vito Chin Date: Thu, 20 Apr 2017 12:53:45 +0800 Subject: [PATCH 309/831] Suggestion to change type 'type' to 'destructuring' to describe f unction declaration with destructuring and default values --- pages/Variable Declarations.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index 9c8821e4a..9676fddfd 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -578,7 +578,7 @@ function f({ a, b }: C): void { ``` But specifying defaults is more common for parameters, and getting defaults right with destructuring can be tricky. -First of all, you need to remember to put the type before the default value. +First of all, you need to remember to put the destructuring before the default value. ```ts function f({ a, b } = { a: "", b: 0 }): void { @@ -587,6 +587,8 @@ function f({ a, b } = { a: "", b: 0 }): void { f(); // ok, default to { a: "", b: 0 } ``` +> The snippet above is an example of type inference, explained later in the handbook. + Then, you need to remember to give a default for optional properties on the destructured property instead of the main initializer. Remember that `C` was defined with `b` optional: From 3a85c0443f8fc3c22c19ed7c0a41e1a8bb201650 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 20 Apr 2017 16:07:50 -0700 Subject: [PATCH 310/831] Update Advanced Types.md --- pages/Advanced Types.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pages/Advanced Types.md b/pages/Advanced Types.md index 26dce4006..3a971d9f5 100644 --- a/pages/Advanced Types.md +++ b/pages/Advanced Types.md @@ -796,18 +796,19 @@ type PersonPartial = Partial; type ReadonlyPerson = Readonly; ``` -Note that this syntax describes a type rather than a member. If you want to add additional members, use an intersection type: +Note that this syntax describes a type rather than a member. +If you want to add additional members, you can use an intersection type: ```ts -// Use this +// Use this: type PartialWithNewMember = { [P in keyof T]?: T[P]; } & { newMember: boolean } -// Instead of this: +// **Do not** use the following! +// This is an error! type PartialWithNewMember = { [P in keyof T]?: T[P]; - // This is an error newMember: boolean; } ``` From c3bae2be76c2a90da35ccbb61ceaf15d978512b3 Mon Sep 17 00:00:00 2001 From: Vito Chin Date: Sat, 22 Apr 2017 08:56:27 +0800 Subject: [PATCH 311/831] Change 'destructuring' to 'pattern' --- pages/Variable Declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index 9676fddfd..a0fc9a1aa 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -578,7 +578,7 @@ function f({ a, b }: C): void { ``` But specifying defaults is more common for parameters, and getting defaults right with destructuring can be tricky. -First of all, you need to remember to put the destructuring before the default value. +First of all, you need to remember to put the pattern before the default value. ```ts function f({ a, b } = { a: "", b: 0 }): void { From 1e0158e62a1ee347fdd185ee7bf0cc56d90b9a90 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Date: Sat, 22 Apr 2017 12:35:53 +1000 Subject: [PATCH 312/831] Correct typo error. Added export with MyApp module class definition --- pages/tutorials/ASP.NET Core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index 7a421ec39..e7ed81226 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -314,7 +314,7 @@ import {MyModel} from "./model" selector: `my-app`, template: `
Hello from {{getCompiler()}}
` }) -class MyApp { +export class MyApp { model = new MyModel(); getCompiler() { return this.model.compiler; From 2404b06d2f4a50496cf986df3c2b5ebe5242c29c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Krupi=C5=84ski?= Date: Mon, 24 Apr 2017 10:40:11 +0200 Subject: [PATCH 313/831] Typo --- pages/declaration files/By Example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/declaration files/By Example.md b/pages/declaration files/By Example.md index 68dc4b7eb..6e66b9322 100644 --- a/pages/declaration files/By Example.md +++ b/pages/declaration files/By Example.md @@ -203,7 +203,7 @@ declare namespace GreetingLib { } ``` -You can also created nested namespaces in one declaration: +You can also create nested namespaces in one declaration: ```ts declare namespace GreetingLib.Options { From 1fdca3bf8643bcc0d3d0f7fe91e9a2ee938eb099 Mon Sep 17 00:00:00 2001 From: Radomir Skrzepij Date: Tue, 25 Apr 2017 21:29:32 +0200 Subject: [PATCH 314/831] Update React & Webpack.md Fix link 'Learn more about tsconfig.json' --- pages/tutorials/React & Webpack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index eff9859e9..c3eb20c4e 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -109,7 +109,7 @@ Simply create a new file in your project root named `tsconfig.json` and fill it } ``` -You can learn more about `tsconfig.json` files [here](../../tsconfig.json.md). +You can learn more about `tsconfig.json` files [here](../tsconfig.json.md). # Write some code From c460234926d7fc78e7022295cf74ddfb39bceeea Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 26 Apr 2017 15:08:31 -0700 Subject: [PATCH 315/831] Add TS 2.3 options --- pages/Compiler Options.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index d634b9e1a..0dc184ef7 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -9,10 +9,12 @@ Option | Type | Default `--alwaysStrict` | `boolean` | `false` | Parse in strict mode and emit `"use strict"` for each source file `--baseUrl` | `string` | | Base directory to resolve non-relative module names. See [Module Resolution documentation](./Module Resolution.md#base-url) for more details. `--charset` | `string` | `"utf8"` | The character set of the input files. +`--checkJs` | `boolean` | `false` | Report errors in `.js` files. Use in conjunction with `--allowJs`. `--declaration`
`-d` | `boolean` | `false` | Generates corresponding `.d.ts` file. `--declarationDir` | `string` | | Output directory for generated declaration files. `--diagnostics` | `boolean` | `false` | Show diagnostic information. `--disableSizeLimit` | `boolean` | `false` | Disable size limitation on JavaScript project. +`--downlevelIteration` | `boolean` | `false` | Provide full support for iterables in `for..of`, spread and destructuring when targeting ES5 or ES3. `--emitBOM` | `boolean` | `false` | Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. `--emitDecoratorMetadata`[1] | `boolean` | `false` | Emit design-type metadata for decorated declarations in source. See [issue #2577](https://github.com/Microsoft/TypeScript/issues/2577) for details. `--experimentalDecorators`[1] | `boolean` | `false` | Enables experimental support for ES decorators. @@ -25,7 +27,7 @@ Option | Type | Default `--isolatedModules` | `boolean` | `false` | Transpile each file as a separate module (similar to "ts.transpileModule"). `--jsx` | `string` | `"Preserve"` | Support JSX in `.tsx` files: `"React"` or `"Preserve"`. See [JSX](./JSX.md). `--jsxFactory` | `string` | `"React.createElement"` | Specify the JSX factory function to use when targeting react JSX emit, e.g. `React.createElement` or `h`. -`--lib` | `string[]`| | List of library files to be included in the compilation.
Possible values are:
► `ES5`
► `ES6`
► `ES2015`
► `ES7`
► `ES2016`
► `ES2017`
► `DOM`
► `DOM.Iterable`
► `WebWorker`
► `ScriptHost`
► `ES2015.Core`
► `ES2015.Collection`
► `ES2015.Generator`
► `ES2015.Iterable`
► `ES2015.Promise`
► `ES2015.Proxy`
► `ES2015.Reflect`
► `ES2015.Symbol`
► `ES2015.Symbol.WellKnown`
► `ES2016.Array.Include`
► `ES2017.object`
► `ES2017.SharedMemory`

Note: If `--lib` is not specified a default library is injected. The default library injected is:
► For `--target ES5`: `DOM,ES5,ScriptHost`
► For `--target ES6`: `DOM,ES6,DOM.Iterable,ScriptHost` +`--lib` | `string[]`| | List of library files to be included in the compilation.
Possible values are:
► `ES5`
► `ES6`
► `ES2015`
► `ES7`
► `ES2016`
► `ES2017`
► `ESNext`
► `DOM`
► `DOM.Iterable`
► `WebWorker`
► `ScriptHost`
► `ES2015.Core`
► `ES2015.Collection`
► `ES2015.Generator`
► `ES2015.Iterable`
► `ES2015.Promise`
► `ES2015.Proxy`
► `ES2015.Reflect`
► `ES2015.Symbol`
► `ES2015.Symbol.WellKnown`
► `ES2016.Array.Include`
► `ES2017.object`
► `ES2017.SharedMemory`
► `esnext.asynciterable`

Note: If `--lib` is not specified a default library is injected. The default library injected is:
► For `--target ES5`: `DOM,ES5,ScriptHost`
► For `--target ES6`: `DOM,ES6,DOM.Iterable,ScriptHost` `--listEmittedFiles` | `boolean` | `false` | Print names of generated files part of the compilation. `--listFiles` | `boolean` | `false` | Print names of files part of the compilation. `--locale` | `string` | *(platform specific)* | The locale to use to show error messages, e.g. en-us. @@ -53,14 +55,15 @@ Option | Type | Default `--preserveConstEnums` | `boolean` | `false` | Do not erase const enum declarations in generated code. See [const enums documentation](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#94-constant-enum-declarations) for more details. `--pretty`[1] | `boolean` | `false` | Stylize errors and messages using color and context. `--project`
`-p` | `string` | | Compile a project given a valid configuration file.
The argument can be a file path to a valid JSON configuration file, or a directory path to a directory containing a `tsconfig.json` file.
See [tsconfig.json](./tsconfig.json.md) documentation for more details. -`--reactNamespace` | `string` | `"React"` | Specifies the object invoked for `createElement` and `__spread` when targeting `"react"` JSX emit. +`--reactNamespace` | `string` | `"React"` | DEPRECATED. Use `--jsxFactory` instead.
Specifies the object invoked for `createElement` and `__spread` when targeting `"react"` JSX emit. `--removeComments` | `boolean` | `false` | Remove all comments except copy-right header comments beginning with `/*!` `--rootDir` | `string` | *(common root directory is computed from the list of input files)* | Specifies the root directory of input files. Only use to control the output directory structure with `--outDir`. `rootDirs`[2] | `string[]`| | List of root folders whose combined content represent the structure of the project at runtime. See [Module Resolution documentation](./Module Resolution.md#virtual-directories-with-rootdirs) for more details. -`--skipDefaultLibCheck` | `boolean` | `false` | Skip type checking of [default library declaration files](./Triple-Slash Directives.md#-reference-no-default-libtrue). +`--skipDefaultLibCheck` | `boolean` | `false` | DEPRECATED. Use `--skipLibCheck` instead.
Skip type checking of [default library declaration files](./Triple-Slash Directives.md#-reference-no-default-libtrue). `--skipLibCheck` | `boolean` | `false` | Skip type checking of all declaration files (`*.d.ts`). `--sourceMap` | `boolean` | `false` | Generates corresponding `.map` file. `--sourceRoot` | `string` | | Specifies the location where debugger should locate TypeScript files instead of source locations. Use this flag if the sources will be located at run-time in a different location than that at design-time. The location specified will be embedded in the sourceMap to direct the debugger where the source files will be located. +`--strict` | `boolean` | `false` | Enable all strict type checking options.
Enabling `--strict` enables `--noImplicitAny`, `--noImplicitThis`, `--alwaysStrict` and `--strictNullChecks`. `--strictNullChecks` | `boolean` | `false` | In strict null checking mode, the `null` and `undefined` values are not in the domain of every type and are only assignable to themselves and `any` (the one exception being that `undefined` is also assignable to `void`). `--stripInternal`[1] | `boolean` | `false` | Do not emit declarations for code that has an `/** @internal */` JSDoc annotation. `--suppressExcessPropertyErrors` | `boolean` | `false` | Suppress excess property checks for object literals. From 471a7f2920e485798d8e164951fad865f6a56201 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 26 Apr 2017 15:21:11 -0700 Subject: [PATCH 316/831] Add release notes for TS 2.3 --- pages/release notes/TypeScript 2.3.md | 182 ++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 pages/release notes/TypeScript 2.3.md diff --git a/pages/release notes/TypeScript 2.3.md b/pages/release notes/TypeScript 2.3.md new file mode 100644 index 000000000..b103a95ab --- /dev/null +++ b/pages/release notes/TypeScript 2.3.md @@ -0,0 +1,182 @@ +# Generators and Iteration for ES5/ES3 + +*First some ES2016 terminology:* + +##### Iterators + +[ES2015 introduced `Iterator`](http://www.ecma-international.org/ecma-262/6.0/#sec-iteration), which is an object that exposes three methods, `next`, `return`, and `throw`, as per the following interface: + +```ts +interface Iterator { + next(value?: any): IteratorResult; + return?(value?: any): IteratorResult; + throw?(e?: any): IteratorResult; +} +``` + +This kind of iterator is useful for iterating over synchronously available values, such as the elements of an Array or the keys of a Map. +An object that supports iteration is said to be "iterable" if it has a `Symbol.iterator` method that returns an `Iterator` object. + +The Iterator protocol also defines the target of some of the ES2015 features like `for..of` and spread operator and the array rest in destructuring assignmnets. + +##### Generators + +[ES2015 also introduced "Generators"](http://www.ecma-international.org/ecma-262/6.0/#sec-generatorfunction-objects), which are functions that can be used to yield partial computation results via the `Iterator` interface and the `yield` keyword. +Generators can also internally delegate calls to another iterable through `yield *`. For example: + +```ts +function* f() { + yield 1; + yield* [2, 3]; +} +``` + +##### New `--downlevelIteration` + +Previously generators were only supported if the target is ES6/ES2015 or later. +Moreover, constructs that operate on the Iterator protocol, e.g. `for..of` were only supported if they operate on arrays for targets below ES6/ES2015. + +TypeScript 2.3 adds full support for generators and the Iterator protocol for ES3 and ES5 targets with `--downlevelIteration` flag. + +With `--downlevelIteration`, the compiler uses new type check and emit behavior that attempts to call a `[Symbol.iterator]()` method on the iterated object if it is found, and creates a synthetic array iterator over the object if it is not. + +> Please note that this requires a native `Symbol.iterator` or `Symbol.iterator` shim at runtime for any non-array values. + +`for..of` statements, Array Destructuring, and Spread elements in Array, Call, and New expressions support `Symbol.iterator` in ES5/E3 if available when using `--downlevelIteration`, but can be used on an Array even if it does not define `Symbol.iterator` at run time or design time. + +# Async Iteration + +TypeScript 2.3 adds support for the async iterators and generators as described by the current [TC39 proposal](https://github.com/tc39/proposal-async-iteration). + +##### Async iterators + +The Async Iteration introduces an `AsyncIterator`, which is similar to `Iterator`. +The difference lies in the fact that the `next`, `return`, and `throw` methods of an `AsyncIterator` return a `Promise` for the iteration result, rather than the result itself. +This allows the caller to enlist in an asynchronous notification for the time at which the `AsyncIterator` has advanced to the point of yielding a value. +An `AsyncIterator` has the following shape: + +```ts +interface AsyncIterator { + next(value?: any): Promise>; + return?(value?: any): Promise>; + throw?(e?: any): Promise>; +} +``` + +An object that supports async iteration is said to be "iterable" if it has a `Symbol.asyncIterator` method that returns an `AsyncIterator` object. + +##### Async Generators + +The [Async Iteration proposal](https://github.com/tc39/proposal-async-iteration) introduces "Async Generators", which are async functions that also can be used to yield partial computation results. +Async Generators can also delegate calls via `yield*` to either an iterable or async iterable: + +```ts +async function* g() { + yield 1; + await sleep(100); + yield* [2, 3]; + yield* (async function *() { + await sleep(100); + yield 4; + })(); +} +``` + +As with Generators, Async Generators can only be function declarations, function expressions, or methods of classes or object literals. +Arrow functions cannot be Async Generators. Async Generators require a valid, global `Promise` implementation (either native or an ES2015-compatible polyfill), in addition to a valid `Symbol.asyncIterator` reference (either a native symbol or a shim). + +##### The `for-await-of` Statement + +Finally, ES2015 introduced the `for..of` statement as a means of iterating over an iterable. +Similarly, the Async Iteration proposal introduces the `for..await..of` statement to iterate over an async iterable: + +```ts +async function f() { + for await (const x of g()) { + console.log(x); + } +} +``` + +The `for..await..of` statement is only legal within an Async Function or Async Generator. + +##### Caveats + +* Keep in mind that our support for async iterators relies on support for `Symbol.asyncIterator` to exist at runtime. You may need to polyfill `Symbol.asyncIterator`, which for simple purposes can be as simple as: `(Symbol as any).asyncIterator = Symbol.asyncIterator || Symbol.from("Symbol.asyncIterator");` +* You also need to include `esnext` in your `--lib` option, to get the `AsyncIterator` declaration if you do not already have it. +* Finally, if your target is ES5 or ES3, you'll also need to set the `--downlevelIterators` flag. + +# Generic parameter defaults + +TypeScript 2.3 adds support for declaring defaults for generic type parameters. + +##### Example + +Consider a function that creates a new `HTMLElement`, calling it with no arguments generats an `Div`; you can optionally pass a list of children as well. Previously you would have to define it as: + +```ts +declare function create(): Container; +declare function create(element: T): Container; +declare function create(element: T, children: U[]): Container; +``` + +With generic parameter defaults we can reduce it to: + +```ts +declare function create(element?: T, children?: U): Container; +``` + +A generic parameter default follows the following rules: + +* A type parameter is deemed optional if it has a default. +* Required type parameters must not follow optional type parameters. +* Default types for a type parameter must satisfy the constraint for the type parameter, if it exists. +* When specifying type arguments, you are only required to specify type arguments for the required type parameters. Unspecified type parameters will resolve to their default types. +* If a default type is specified and inference cannot chose a candidate, the default type is inferred. +* A class or interface declaration that merges with an existing class or interface declaration may introduce a default for an existing type parameter. +* A class or interface declaration that merges with an existing class or interface declaration may introduce a new type parameter as long as it specifies a default. + +# New `--strict` master option + +New checks added to TypeScript are often off by default to avoid breaking existing projects. +While avoiding breakage is a good thing, this strategy has the drawback of making it increasingly complex to choose the highest level of type safety, and doing so requires explicit opt-in action on every TypeScript release. +With the `--strict` option it becomes possible to choose maximum type safety with the understanding that additional errors might be reported by newer versions of the compiler as improved type checking features are added. + +The new `--strict` compiler option represents the recommended setting of a number of type checking options. Specifically, specifying `--strict` corresponds to specifying all of the following options (and may in the future include more options): + +* `--strictNullChecks` +* `--noImplicitAny` +* `--noImplicitThis` +* `--alwaysStrict` + +In exact terms, the `--strict` option sets the *default* value for the compiler options listed above. +This means it is still possible to individually control the options. +For example, + +```sh +--strict --noImplicitThis false +``` + +has the effect of turning on all strict options *except* the `--noImplicitThis` option. Using this scheme it is possible to express configurations consisting of *all* strict options except some explicitly listed options. +In other words, it is now possible to default to the highest level of type safety but opt out of certain checks. + +Starting with TypeScript 2.3, the default `tsconfig.json` generated by `tsc --init` includes a `"strict": true` setting in the `"compilerOptions"` section. +Thus, new projects started with `tsc --init` will by default have the highest level of type safety enabled. + +# Enhanced `--init` output + +Along with setting `--strict` on by default, `tsc --init` has an enhanced output. Default `tsconfig.json` files generated by `tsc --init` now include a set of the common compiler options along with their descriptions commented out. +Just un-comment the configuration you like to set to get the desired behavior; we hope the new output simplifies the setting up new projects and keeps configuration files readable as projects grow. + +# Errors in .js files with `--checkJs` + +By default the TypeScript compiler does not report any errors in .js files including using `--allowJs`. +With TypeScript 2.3 type-checking errors can also be reported in `.js` files with `--checkJs`. + +You can skip checking some files by adding `// @ts-nocheck` comment to them; conversely you can choose to check only a few `.js` files by adding `// @ts-check` comment to them without setting `--checkJs`. +You can also ignore errors on specific lines by adding `// @ts-ignore` on the preceding line. + +`.js` files are still checked to ensure that they only include standard ECMAScript features; type annotations are only allowed in `.ts` files and are flagged as errors in `.js` files. +JSDoc comments can be used to add some type information to your JavaScript code, see [JSDoc Support documentation](https://github.com/Microsoft/TypeScript/wiki/JSDoc-support-in-JavaScript) for more details about the supported JSDoc constructs. + +See [Type checking JavaScript Files documentation](https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files) for more details. From 77baa310812f84ccf185e79f201e7f132d034b8b Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 28 Apr 2017 17:36:30 -0700 Subject: [PATCH 317/831] Fixes https://github.com/Microsoft/TypeScript/issues/15441 --- pages/Generics.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pages/Generics.md b/pages/Generics.md index 20ed9811c..dbab53f98 100644 --- a/pages/Generics.md +++ b/pages/Generics.md @@ -316,11 +316,10 @@ class Lion extends Animal { keeper: ZooKeeper; } -function findKeeper (a: {new(): A; - prototype: {keeper: K}}): K { - - return a.prototype.keeper; +function createInstance(c: new () => A): A { + return new c(); } -findKeeper(Lion).nametag; // typechecks! +createInstance(Lion).keeper.nametag; // typechecks! +createInstance(Bee).keeper.hasMask; // typechecks! ``` From 25d8fe21b28ead01413de84acb28245dcea366da Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 2 May 2017 15:28:38 -0400 Subject: [PATCH 318/831] Add closing backtick to Person --- pages/release notes/TypeScript 2.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/release notes/TypeScript 2.1.md b/pages/release notes/TypeScript 2.1.md index 65d0d0f29..926c31a25 100644 --- a/pages/release notes/TypeScript 2.1.md +++ b/pages/release notes/TypeScript 2.1.md @@ -57,7 +57,7 @@ setProperty(x, "foo", "string"); // Error!, string expected number # Mapped Types One common task is to take an existing type and make each of its properties entirely optional. -Let's say we have a `Person: +Let's say we have a `Person`: ```ts interface Person { From 09e73c150a3d01b86becace6942dbc546afbf17e Mon Sep 17 00:00:00 2001 From: Stephen Lewis Date: Tue, 2 May 2017 14:19:31 -0700 Subject: [PATCH 319/831] Fix minor grammatical misstep. --- pages/tutorials/Gulp.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pages/tutorials/Gulp.md b/pages/tutorials/Gulp.md index 11cdfd8f1..7a11cf9bb 100644 --- a/pages/tutorials/Gulp.md +++ b/pages/tutorials/Gulp.md @@ -46,8 +46,7 @@ You can always go back and change these in the `package.json` file that's been g ## Install our dependencies Now we can use `npm install` to install packages. -First install TypeScript and gulp globally. -(You might need to start `npm install` commands in this guide with `sudo` if you're on a Unix system.) +First install `gulp-cli` globally (if you use a Unix system, you may need to prefix the `npm install` commands in this guide with `sudo`). ```shell npm install -g gulp-cli From 29579dd5e552a27fb08e15216092db24650662a6 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 4 May 2017 17:43:57 -0700 Subject: [PATCH 320/831] Fixes https://github.com/Microsoft/TypeScript-wiki/issues/122 --- pages/release notes/TypeScript 2.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/release notes/TypeScript 2.1.md b/pages/release notes/TypeScript 2.1.md index 65d0d0f29..8e45d23a9 100644 --- a/pages/release notes/TypeScript 2.1.md +++ b/pages/release notes/TypeScript 2.1.md @@ -132,7 +132,7 @@ const nameAndAgeOnly = pick(person, "name", "age"); // { name: string, age: num ```ts // For every properties K of type T, transform it to U -function mapObject(obj: Record, f: (x: T) => U): Record +function mapObject(obj: Record, f: (x: T) => U): Record const names = { foo: "hello", bar: "world", baz: "bye" }; const lengths = mapObject(names, s => s.length); // { foo: number, bar: number, baz: number } From 35b7c35d75ffb7537d94b3877c34ae189ff47c77 Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Mon, 8 May 2017 14:27:16 -0700 Subject: [PATCH 321/831] removing a couple tutorials --- pages/tutorials/ASP.NET 4.md | 260 ----------------------------------- pages/tutorials/Knockout.md | 187 ------------------------- 2 files changed, 447 deletions(-) delete mode 100644 pages/tutorials/ASP.NET 4.md delete mode 100644 pages/tutorials/Knockout.md diff --git a/pages/tutorials/ASP.NET 4.md b/pages/tutorials/ASP.NET 4.md deleted file mode 100644 index ea3624772..000000000 --- a/pages/tutorials/ASP.NET 4.md +++ /dev/null @@ -1,260 +0,0 @@ -# Setup - -## Install TypeScript - -If your version of Visual Studio does not already have TypeScript, you can install it for [Visual Studio 2015](http://www.microsoft.com/en-us/download/details.aspx?id=48593) or [Visual Studio 2013](https://www.microsoft.com/en-us/download/details.aspx?id=48739). -This quickstart uses Visual Studio 2015. - -## Create a new project - -1. Choose **File** -2. Choose **New Project** -3. Choose **Visual C#** -4. Choose **ASP.NET Web Application** - - ![Create new ASP.NET project](../../assets/images/tutorials/aspnet/new-asp-project.png) - -5. Choose **MVC** - - I unchecked "Host in the cloud" since this will be a local demo. - ![Use MVC template](../../assets/images/tutorials/aspnet/new-asp-project-template.png) - -Run the application and make sure that it works. - -# Add TypeScript - -The next step is to add a folder for TypeScript. - -![Create new folder](../../assets/images/tutorials/aspnet/new-folder.png) - -We'll just call it src. - -![src folder](../../assets/images/tutorials/aspnet/src-folder.png) - -## Add TypeScript code - -Right click on `src` and click **New Item**. -Then choose **TypeScript File** and name the file `app.ts`. - -![New item](../../assets/images/tutorials/aspnet/new-item.png) - -## Add example code - -Type the following code into `app.ts`. - -```ts -function sayHello() { - const compiler = (document.getElementById("compiler") as HTMLInputElement).value; - const framework = (document.getElementById("framework") as HTMLInputElement).value; - return `Hello from ${compiler} and ${framework}!`; -} -``` - -## Set up the build - -Right click on the project and click **New Item**. -Then choose **TypeScript Configuration File** and use the default name `tsconfig.json`. - -![Create tsconfig.json](../../assets/images/tutorials/aspnet/new-tsconfig.png) - -Replace the default `tsconfig.json` with the following: - -```json -{ - "compilerOptions": { - "noImplicitAny": true, - "noEmitOnError": true, - "sourceMap": true, - "target": "es5", - "outDir": "./Scripts/App" - }, - "files": [ - "./src/app.ts", - ], - "compileOnSave": true -} -``` - -This is similar to the default, with the following differences: - -1. It sets `"noImplicitAny": true`. -2. It specifies that `"outDir": "./Scripts/App"`. -3. It explicitly lists `"files"` instead of relying on `"excludes"`. -4. It sets `"compileOnSave": true`. - -`"noImplicitAny"` is good idea whenever you're writing new code — you can make sure that you don't write any untyped code by mistake. -`"compileOnSave"` makes it easy to update your code in a running web app. -See [the tsconfig.json documentation](../tsconfig.json.md) for more information. - -## Call the script from a view - -1. In the **Solution Explorer**, open **Views** | **Home** | `Index.cshtml`. - - ![Open Index.cshtml](../../assets/images/tutorials/aspnet/open-index.png) - -2. Change the code to be the following: - - ```html - @{ - ViewBag.Title = "Home Page"; - } - -
-
- Compiler:
- Framework: -
- ``` - -## Test - -1. Run the project. -2. You should see a message when you type in the input boxes: - -![Picture of running demo](../../assets/images/tutorials/aspnet/running-demo.png) - -## Debug - -1. In Edge, press F12 and click the **Debugger** tab. -2. Look in the first localhost folder, then src/app.ts -3. Put a breakpoint on the line with `return`. -4. Type in the boxes and confirm that the breakpoint hits in TypeScript code and that inspection works correctly. - -![Demo paused on breakpoint](../../assets/images/tutorials/aspnet/paused-demo.png) - -That's all you need to know to include basic TypeScript in your ASP.NET project. -Next we'll include Angular and write a simple Angular app. - -# Add Angular 2 - -## Download packages from NPM - -1. Install [PackageInstaller](https://github.com/madskristensen/PackageInstaller). - -2. Use PackageInstaller to install Angular 2, systemjs and Typings. - - Right-click on the project, then click on **Quick Install Package**. - - ![Use PackageInstaller to install angular2](../../assets/images/tutorials/aspnet/packageinstaller-angular2.png) - ![Use PackageInstaller to install systemjs](../../assets/images/tutorials/aspnet/packageinstaller-systemjs.png) - ![Use PackageInstaller to install Typings](../../assets/images/tutorials/aspnet/packageinstaller-typings.png) - -3. Use PackageInstaller to install typings for es6-shim. - - Angular 2 includes es6-shim for Promise support, but TypeScript still needs the types. - In PackageInstaller, choose Typing instead of npm. - Then type "es6-shim": - - ![Use PackageInstaller to install es6-shim typings](../../assets/images/tutorials/aspnet/packageinstaller-es6-shim.png) - -## Update tsconfig.json - -Now that Angular 2 and its dependencies are installed, we need to enable TypeScript's experimental support for decorators and include the es6-shim typings. -In the future decorators and ES6 will be the default and these settings will not be needed. -Add `"experimentalDecorators": true, "emitDecoratorMetadata": true` to the `"compilerOptions"` section, and add `"./typings/index.d.ts"` to the `"files"` section. -Finally, we need to add a new entry in `"files"` for another file, `"./src/model.ts"`, that we will create. -Our `tsconfig.json` should now look like this: - -```json -{ - "compilerOptions": { - "noImplicitAny": false, - "noEmitOnError": true, - "sourceMap": true, - "target": "es5", - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "outDir": "./Scripts/App" - }, - "files": [ - "./src/app.ts", - "./src/model.ts", - "./src/main.ts", - "./typings/index.d.ts" - ] -} -``` - -## Add a CopyFiles target to the build - -Finally, we need to make sure that the Angular files are copied as part of the build. -To do this, edit the project by right-clicking 'Unload' and then 'Edit csproj'. -After the TypeScript configuration PropertyGroup, add a new ItemGroup and Target to copy the angular files. - -```xml - - - - - - - - - -``` - -Now right-click on the project and reload it. -You should now see `node_modules` in the Solution Explorer. - -## Write a simple Angular app in TypeScript - -First, change the code in `app.ts` to: - -```ts -import {Component} from "angular2/core" -import {MyModel} from "./model" - -@Component({ - selector: `my-app`, - template: `
Hello from {{getCompiler()}}
` -}) -class MyApp { - model = new MyModel(); - getCompiler() { - return this.model.compiler; - } -} -``` - -Then add another TypeScript file in `src` named `model.ts`: - -```ts -export class MyModel { - compiler = "TypeScript"; -} -``` - -And then another TypeScript file in `src` named `main.ts`: - -```ts -import {bootstrap} from "angular2/platform/browser"; -import {MyApp} from "./app"; -bootstrap(MyApp); -``` - -Finally, change the code in `Views/Home/Index.cshtml` to the following: - -```html -@{ - ViewBag.Title = "Home Page"; -} - - - - - -Loading... -``` - -This loads the app. -When you run the ASP.NET application you should see a div that says "Loading..." and then updates to say "Hello from TypeScript". diff --git a/pages/tutorials/Knockout.md b/pages/tutorials/Knockout.md deleted file mode 100644 index 03286835b..000000000 --- a/pages/tutorials/Knockout.md +++ /dev/null @@ -1,187 +0,0 @@ -This quick start guide will teach you how to wire up TypeScript with [Knockout.js](http://knockoutjs.com/). - -We assume that you're already using [Node.js](https://nodejs.org/) with [npm](https://www.npmjs.com/). - -# Lay out the project - -Let's start out with a new directory. -We'll name it `proj` for now, but you can change it to whatever you want. - -```shell -mkdir proj -cd proj -``` - -To start, we're going to structure our project in the following way: - -```text -proj/ - ├─ src/ - └─ built/ -``` - -TypeScript files will start out in your `src` folder, run through the TypeScript compiler, and end up in `built`. - -Let's scaffold this out: - -```shell -mkdir src -mkdir built -``` - -# Initialize the project - -Now we'll turn this folder into an npm package. - -```shell -npm init -``` - -You'll be given a series of prompts. -You can use the defaults except for your entry point. -You can always go back and change these in the `package.json` file that's been generated for you. - -# Install our build dependencies - -First ensure TypeScript is installed globally. - -```shell -npm install -g typescript -``` - -We'll also grab declaration files for Knockout to describe the library's shape for TypeScript. - -```shell -npm install --save @types/knockout -``` - -# Grab our runtime dependencies - -We'll need to grab Knockout itself, as well as something called RequireJS. -[RequireJS](http://www.requirejs.org/) is a library that enables us to load modules at runtime asynchronously. - -There are several ways we can go about this: - -1. Download the files manually and host them. -2. Download the files through a package manager like [Bower](http://bower.io/) and host them. -3. Use a Content Delivery Network (CDN) to host both files. - -We'll keep it simple and go with the first option, but Knockout's documentation has [details on using a CDN](http://knockoutjs.com/downloads/index.html), and more libraries like RequireJS can be searched for on [cdnjs](https://cdnjs.com/). - -Let's create an `externals` folder in the root of our project. - -```shell -mkdir externals -``` - -Now [download Knockout](http://knockoutjs.com/downloads/index.html) and [download RequireJS](http://www.requirejs.org/docs/download.html#latest) into that folder. -The latest and minified versions of the files should work just fine. - -# Add a TypeScript configuration file - -You'll want to bring your TypeScript files together - both the code you'll be writing as well as any necessary declaration files. - -To do this, you'll need to create a `tsconfig.json` which contains a list of your input files as well as all your compilation settings. -Simply create a new file in your project root named `tsconfig.json` and fill it with the following contents: - -```json -{ - "compilerOptions": { - "outDir": "./built/", - "sourceMap": true, - "noImplicitAny": true, - "module": "amd", - "target": "es5" - }, - "files": [ - "./src/require-config.ts", - "./src/hello.ts" - ] -} -``` - -You can learn more about `tsconfig.json` files [here](../tsconfig.json.md). - -# Write some code - -Let's write our first TypeScript file using Knockout. -First, create a new file in your `src` directory named `hello.ts`. - -```ts -import * as ko from "knockout"; - -class HelloViewModel { - language: KnockoutObservable - framework: KnockoutObservable - - constructor(language: string, framework: string) { - this.language = ko.observable(language); - this.framework = ko.observable(framework); - } -} - -ko.applyBindings(new HelloViewModel("TypeScript", "Knockout")); -``` - -Next, we'll create a file named `require-config.ts` in `src` as well. - -```ts -declare var require: any; -require.config({ - paths: { - "knockout": "externals/knockout-3.4.0", - } -}); -``` - -This file will tell RequireJS where to find Knockout when we import it, just like we did in `hello.ts`. -Any page that you create should include this immediately after RequireJS, but before importing anything else. -To get a better understanding of this file and how to configure RequireJS, you can [read up on its documentation](http://requirejs.org/docs/api.html#config). - -We'll also need a view to display our `HelloViewModel`. -Create a file at the root of `proj` named `index.html` with the following contents: - -```html - - - - - Hello Knockout! - - -

- Hello from - todo - and - todo! -

- -

Language:

-

Framework:

- - - - - - -``` - -Notice there are three script tags. -First, we're including RequireJS itself. -Then we're mapping the paths of our external dependencies in `require-config.js` so that RequireJS knows where to look for them. -Finally, we're calling `require` with a list of modules we'd like to load. - -# Putting it all together - -Just run: - -```shell -tsc -``` - -Now open up `index.html` in your favorite browser and everything should be ready to use! -You should see a page that says "Hello from TypeScript and Knockout!" -Below that, you'll also see two input boxes. -As you modify their contents and switch focus, you'll see that the original message changes. From 2ce5f9fee27b15e53e8ed7740065a524514c69a2 Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 07:56:46 -0700 Subject: [PATCH 322/831] added ts in 5 tutorial --- pages/tutorials/TS-in-5.md | 182 +++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 pages/tutorials/TS-in-5.md diff --git a/pages/tutorials/TS-in-5.md b/pages/tutorials/TS-in-5.md new file mode 100644 index 000000000..127e5382f --- /dev/null +++ b/pages/tutorials/TS-in-5.md @@ -0,0 +1,182 @@ +--- +title: TypeScript in 5 Minutes +layout: docs +permalink: /docs/handbook/TS-in-5.html +description: "In this tutorial, you'll learn the basics of the TypeScript language in under 5 minutes." +--- + +Let's get started by building a simple web application with TypeScript. + +## Installing TypeScript + +There are two main ways to get the TypeScript tools: + +* Via npm (the Node.js package manager) +* By installing TypeScript's Visual Studio plugins + +Visual Studio 2017 and Visual Studio 2015 Update 3 include TypeScript by default. +If you didn't install TypeScript with Visual Studio, you can still [download it](/#download-links). + +For NPM users: + +```shell +> npm install -g typescript +``` + +## Building your first TypeScript file + +In your editor, type the following JavaScript code in `greeter.ts`: + +```ts +function greeter(person) { + return "Hello, " + person; +} + +var user = "Jane User"; + +document.body.innerHTML = greeter(user); +``` + +## Compiling your code + +We used a `.ts` extension, but this code is just JavaScript. +You could have copy/pasted this straight out of an existing JavaScript app. + +At the command line, run the TypeScript compiler: + +```shell +tsc greeter.ts +``` + +The result will be a file `greeter.js` which contains the same JavaScript that you fed in. +We're up and running using TypeScript in our JavaScript app! + +Now we can start taking advantage of some of the new tools TypeScript offers. +Add a `: string` type annotation to the 'person' function argument as shown here: + +```ts +function greeter(person: string) { + return "Hello, " + person; +} + +var user = "Jane User"; + +document.body.innerHTML = greeter(user); +``` + +## Type annotations + +Type annotations in TypeScript are lightweight ways to record the intended contract of the function or variable. +In this case, we intend the greeter function to be called with a single string parameter. +We can try changing the call greeter to pass an array instead: + +```ts +function greeter(person: string) { + return "Hello, " + person; +} + +var user = [0, 1, 2]; + +document.body.innerHTML = greeter(user); +``` + +Re-compiling, you'll now see an error: + +```shell +greeter.ts(7,26): Supplied parameters do not match any signature of call target +``` + +Similarly, try removing all the arguments to the greeter call. +TypeScript will let you know that you have called this function with an unexpected number of parameters. +In both cases, TypeScript can offer static analysis based on both the structure of your code, and the type annotations you provide. + +Notice that although there were errors, the `greeter.js` file is still created. +You can use TypeScript even if there are errors in your code. But in this case, TypeScript is warning that your code will likely not run as expected. + +## Interfaces + +Let's develop our sample further. Here we use an interface that describes objects that have a firstName and lastName field. +In TypeScript, two types are compatible if their internal structure is compatible. +This allows us to implement an interface just by having the shape the interface requires, without an explicit `implements` clause. + + +```ts +interface Person { + firstName: string; + lastName: string; +} + +function greeter(person: Person) { + return "Hello, " + person.firstName + " " + person.lastName; +} + +var user = { firstName: "Jane", lastName: "User" }; + +document.body.innerHTML = greeter(user); +``` + +## Classes + +Finally, let's extend the example one last time with classes. +TypeScript supports new features in JavaScript, like support for class-based object-oriented programming. + +Here we're going to create a `Student` class with a constructor and a few public fields. +Notice that classes and interfaces play well together, letting the programmer decide on the right level of abstraction. + +Also of note, the use of `public` on arguments to the constructor is a shorthand that allows us to automatically create properties with that name. + +```ts +class Student { + fullName: string; + constructor(public firstName, public middleInitial, public lastName) { + this.fullName = firstName + " " + middleInitial + " " + lastName; + } +} + +interface Person { + firstName: string; + lastName: string; +} + +function greeter(person : Person) { + return "Hello, " + person.firstName + " " + person.lastName; +} + +var user = new Student("Jane", "M.", "User"); + +document.body.innerHTML = greeter(user); +``` + + + +Re-run `tsc greeter.ts` and you'll see the generated JavaScript is the same as the earlier code. +Classes in TypeScript are just a shorthand for the same prototype-based OO that is frequently used in JavaScript. + + +## Running your TypeScript web app + +Now type the following in `greeter.html`: + +```html + + + TypeScript Greeter + + + + +``` + +Open `greeter.html` in the browser to run your first simple TypeScript web application! + +Optional: Open `greeter.ts` in Visual Studio, or copy the code into the TypeScript playground. +You can hover over identifiers to see their types. +Notice that in some cases these types are inferred automatically for you. +Re-type the last line, and see completion lists and parameter help based on the types of the DOM elements. +Put your cursor on the reference to the greeter function, and hit F12 to go to its definition. +Notice, too, that you can right-click on a symbol and use refactoring to rename it. + +The type information provided works together with the tools to work with JavaScript at application scale. +For more examples of what's possible in TypeScript, see the Samples section of the website. + +![Visual Studio picture](/assets/images/docs/greet_person.png) \ No newline at end of file From 2c8f01c0a0036083cc47da9469e2a893253e14f7 Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 08:03:13 -0700 Subject: [PATCH 323/831] fixed lint --- pages/tutorials/TS-in-5.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pages/tutorials/TS-in-5.md b/pages/tutorials/TS-in-5.md index 127e5382f..e1643c0ad 100644 --- a/pages/tutorials/TS-in-5.md +++ b/pages/tutorials/TS-in-5.md @@ -99,7 +99,6 @@ Let's develop our sample further. Here we use an interface that describes object In TypeScript, two types are compatible if their internal structure is compatible. This allows us to implement an interface just by having the shape the interface requires, without an explicit `implements` clause. - ```ts interface Person { firstName: string; @@ -147,12 +146,9 @@ var user = new Student("Jane", "M.", "User"); document.body.innerHTML = greeter(user); ``` - - Re-run `tsc greeter.ts` and you'll see the generated JavaScript is the same as the earlier code. Classes in TypeScript are just a shorthand for the same prototype-based OO that is frequently used in JavaScript. - ## Running your TypeScript web app Now type the following in `greeter.html`: From 7caa900fffa81237d8fdce37eb72fa53cd8e9d2b Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 09:19:06 -0700 Subject: [PATCH 324/831] fix doc typo --- pages/tutorials/TS-in-5.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pages/tutorials/TS-in-5.md b/pages/tutorials/TS-in-5.md index e1643c0ad..bf41debdd 100644 --- a/pages/tutorials/TS-in-5.md +++ b/pages/tutorials/TS-in-5.md @@ -1,10 +1,3 @@ ---- -title: TypeScript in 5 Minutes -layout: docs -permalink: /docs/handbook/TS-in-5.html -description: "In this tutorial, you'll learn the basics of the TypeScript language in under 5 minutes." ---- - Let's get started by building a simple web application with TypeScript. ## Installing TypeScript From 5d0e4402df98287f3771dfcc75e9ccd43db0f2cf Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 09:44:52 -0700 Subject: [PATCH 325/831] changed file name to give better title --- pages/tutorials/{TS-in-5.md => TypeScript in 5 minutes.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pages/tutorials/{TS-in-5.md => TypeScript in 5 minutes.md} (100%) diff --git a/pages/tutorials/TS-in-5.md b/pages/tutorials/TypeScript in 5 minutes.md similarity index 100% rename from pages/tutorials/TS-in-5.md rename to pages/tutorials/TypeScript in 5 minutes.md From 03af53aafde659139448a87108a5588fe6941ebe Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 20:34:19 -0700 Subject: [PATCH 326/831] updated error message --- pages/tutorials/TypeScript in 5 minutes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/TypeScript in 5 minutes.md b/pages/tutorials/TypeScript in 5 minutes.md index bf41debdd..7428c19fe 100644 --- a/pages/tutorials/TypeScript in 5 minutes.md +++ b/pages/tutorials/TypeScript in 5 minutes.md @@ -76,7 +76,7 @@ document.body.innerHTML = greeter(user); Re-compiling, you'll now see an error: ```shell -greeter.ts(7,26): Supplied parameters do not match any signature of call target +greeter.ts(7,26): error TS2345: Argument of type 'number[]' is not assignable to parameter of type 'string'. ``` Similarly, try removing all the arguments to the greeter call. From 58870c2978f0f665ec935b9aad0ec91879db23b2 Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 23:30:53 -0700 Subject: [PATCH 327/831] updated docs to reference quick starts --- pages/tutorials/ASP.NET Core.md | 4 ++-- pages/tutorials/Migrating from JavaScript.md | 2 ++ pages/tutorials/React & Webpack.md | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index e7ed81226..9a3bcf5a1 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -3,9 +3,9 @@ ## Install ASP.NET Core and TypeScript First, [install ASP.NET Core](https://get.asp.net) if you need it. -This quick-start guide uses Visual Studio, which means that you'll need Visual Studio 2015 in order to use ASP.NET Core. +This quick-start guide uses Visual Studio, which means that you'll need Visual Studio 2015 or [Visual Studio 2017](https://www.visualstudio.com/downloads/) in order to use ASP.NET Core. -Next, if your version of Visual Studio does not already have TypeScript, you can install it for [Visual Studio 2015](http://www.microsoft.com/en-us/download/details.aspx?id=48593). +Next, if your version of Visual Studio does not already have the latest TypeScript, you can [install it](http://www.microsoft.com/en-us/download/details.aspx?id=48593). ## Create a new project diff --git a/pages/tutorials/Migrating from JavaScript.md b/pages/tutorials/Migrating from JavaScript.md index b089abd0e..7c72119db 100644 --- a/pages/tutorials/Migrating from JavaScript.md +++ b/pages/tutorials/Migrating from JavaScript.md @@ -4,6 +4,8 @@ Converting a JavaScript codebase over to TypeScript is, while somewhat tedious, In this tutorial, we're going to look at how you might start out. We assume you've read enough of the handbook to write new TypeScript code. +If you're looking to convert a React project, we recommend looking at the [React Conversion Guide](https://github.com/Microsoft/TypeScript-React-Conversion-Guide#typescript-react-conversion-guide) first. + # Setting up your Directories If you're writing in plain JavaScript, it's likely that you're running your JavaScript directly, diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index c3eb20c4e..5c055ea2a 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -1,6 +1,8 @@ -This quick start guide will teach you how to wire up TypeScript with [React](http://facebook.github.io/react/) and [webpack](http://webpack.github.io/). +This guide will teach you how to wire up TypeScript with [React](http://facebook.github.io/react/) and [webpack](http://webpack.github.io/). -We assume that you're already using [Node.js](https://nodejs.org/) with [npm](https://www.npmjs.com/). +If you're starting a brand new project, take a look at the [React Quick Start guide](/samples/index.html) first. + +Otherwise, we assume that you're already using [Node.js](https://nodejs.org/) with [npm](https://www.npmjs.com/). # Lay out the project From 71aca7f9888783c51961a3b170872841f604f284 Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 23:55:23 -0700 Subject: [PATCH 328/831] update asp.net core wording --- pages/tutorials/ASP.NET Core.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index 9a3bcf5a1..c2a881c14 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -1,9 +1,11 @@ # Setup +> Note! Updates for Visual Studio 2017 and the latest version of ASP.NET coming soon! + ## Install ASP.NET Core and TypeScript First, [install ASP.NET Core](https://get.asp.net) if you need it. -This quick-start guide uses Visual Studio, which means that you'll need Visual Studio 2015 or [Visual Studio 2017](https://www.visualstudio.com/downloads/) in order to use ASP.NET Core. +This quick-start guide uses Visual Studio, which means that you'll need Visual Studio 2015 in order to use ASP.NET Core. Next, if your version of Visual Studio does not already have the latest TypeScript, you can [install it](http://www.microsoft.com/en-us/download/details.aspx?id=48593). From 0d38fe20e5e95717a5d1a4efb11320c8602d868d Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Tue, 9 May 2017 23:59:42 -0700 Subject: [PATCH 329/831] fix lint --- pages/tutorials/ASP.NET Core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index c2a881c14..376e56fa6 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -1,6 +1,6 @@ # Setup -> Note! Updates for Visual Studio 2017 and the latest version of ASP.NET coming soon! +> Note! Updates for Visual Studio 2017 and the latest version of ASP.NET coming soon! ## Install ASP.NET Core and TypeScript From fb42f947c5c71de2780af477d4d4f65edb22cbca Mon Sep 17 00:00:00 2001 From: Bowden Kelly Date: Wed, 10 May 2017 00:05:51 -0700 Subject: [PATCH 330/831] updates --- pages/tutorials/ASP.NET Core.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index 376e56fa6..b1e1c4a02 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -1,6 +1,6 @@ # Setup -> Note! Updates for Visual Studio 2017 and the latest version of ASP.NET coming soon! +> Note: Updates for Visual Studio 2017 and the latest version of ASP.NET coming soon! ## Install ASP.NET Core and TypeScript From 760baeaee8a6947bf3ce4432312ced8a3b6e3668 Mon Sep 17 00:00:00 2001 From: Per Lundberg Date: Wed, 10 May 2017 21:27:18 +0300 Subject: [PATCH 331/831] Fixed typo I noticed this while reading the 2.3 release notes. (Side note: it would be great to have an edit button on the typescriptlang.org web page, to easily find the right file on GitHub when suggesting edits. Like the Edit button [here](http://aurelia.io/hub.html#/doc/article/aurelia/framework/latest/contact-manager-tutorial/1). I can file a separate issue about that if you like?) --- pages/release notes/TypeScript 2.3.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/release notes/TypeScript 2.3.md b/pages/release notes/TypeScript 2.3.md index b103a95ab..583ebd385 100644 --- a/pages/release notes/TypeScript 2.3.md +++ b/pages/release notes/TypeScript 2.3.md @@ -112,7 +112,7 @@ TypeScript 2.3 adds support for declaring defaults for generic type parameters. ##### Example -Consider a function that creates a new `HTMLElement`, calling it with no arguments generats an `Div`; you can optionally pass a list of children as well. Previously you would have to define it as: +Consider a function that creates a new `HTMLElement`, calling it with no arguments generates a `Div`; you can optionally pass a list of children as well. Previously you would have to define it as: ```ts declare function create(): Container; From 1ac8b2c5263c92095f4cccc59227a363a7408ec8 Mon Sep 17 00:00:00 2001 From: Limin Zhu Date: Thu, 11 May 2017 16:11:23 -0700 Subject: [PATCH 332/831] Update asp.net guide to work with VS2017 and npm3 --- .../aspnet/install-nuget-packages.png | Bin 0 -> 215866 bytes .../aspnet/new-asp-project-empty-17.PNG | Bin 0 -> 38046 bytes .../aspnet/new-asp-project-template.png | Bin 31632 -> 0 bytes pages/tutorials/ASP.NET Core.md | 66 +++++++++++++----- 4 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 assets/images/tutorials/aspnet/install-nuget-packages.png create mode 100644 assets/images/tutorials/aspnet/new-asp-project-empty-17.PNG delete mode 100644 assets/images/tutorials/aspnet/new-asp-project-template.png diff --git a/assets/images/tutorials/aspnet/install-nuget-packages.png b/assets/images/tutorials/aspnet/install-nuget-packages.png new file mode 100644 index 0000000000000000000000000000000000000000..47afd45f2bc308cf931dd6ad7e87587d996948fc GIT binary patch literal 215866 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%0AY|Z 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�G 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%0D;U*W>u2k5nn ze(GuwdzM7D?n?1`pIcKjmC&+2xFWm1rb2wk`ehh(tn@EMyiArg`lTP-J<5`es$sMjn0yR;8ppP6blR0T8DzMdz+z^?CnPLgz++|Be z-%9J8+(MEZ~%X_vXq1WQ~kT zDN5cKM|Gn+O-9u*i&Z~0%16ouG2h`$`1iVGNpyn*- z+aSl#kP2B-aSpnQck{DN5%o6!C23pS@BhTn8%LS$WT%^0%IMS>u}|%5u1!U$Z%1cC zrC0rnRp~9!!*`L`V+(G{a=SRdWl{g(33)BR88?E9Cg-I<4Kx&od^I;AK)*;fBJ^j4 z#_v6uT>|Sl)Bl@D-+oE0wF`i zHhB7^>EPj!BTy#~+%aWcg2@@)$&{M(3Esw{epK+Zlgznh{j7Xw{^e3q3G3I(!uMNf zd8*rn6~S02cT2?HNG373H{rW7Y*qF- z%dBfNT_<>c4jPeUxXUF^ZefZCI`GMd3?zjko8yX0=xdy5bEAPAk^@!Ra;CPFk#MV) ztmI~1Y!B{j`c}+b2#r{S9=q)@*mYC5E~8RGR5N(OB41PPetzf`!a)mD?qeau1|^=XO|s?TP+qs(7s0kwMaQlg=edZYg1ea z{;CDX5!6H|@nXLv3A{KJ3IGil%8y{C=0WVcx@(FigcxaF@*{?LafwV;Ou#Vr8Cu>Z zU=KD!j0q=*(cQIV#Ug##VYEQLM9>2EY$}@vRT(PqXN2_l^r()O5>S6DZg{vt7Tc=x z>&Sk})STnhUr*0n6j}#D`iiQyFZDU0kC8)a!Xfl%$Kmc+UE!<c zo-!0H?^3_5J5?Nbsju!( zMosQz;ls?>78u&3A)zQy-GqkSQ=CR>W(=25{sp)u9`sG;9zd^c&j{-REWge4a?w+M zRI+kqXGrO1TK4pt2DfkE4_n!|muhiktGF0&6}hD&aX zqz5$tTNIe0#C3V`xb_97Lj!|BhOsJ+HA67alT<6Ch}G`Itpf9uSFa_31mrYn;dXr6 z^z8y(0GI^NDv>6-vAogPPSft&g3PV#Y2@*dG^q_zW{|%d3)XMP5Z+pMDT~p^iYey z9N(EJNC`29$n6nR_FnU`dx{!l4gs_D9=P8Ktw(Y`KB@`ocI~^Xkw6uCJH96(Wi*1t zC38?wX`ADW2-aedZUT;Mo!}D9|0TI~I*E|%>yY2*6Ixp~5>P`v^waS;K+tHxrT4K} zn}P{tb?+V1$|fI%($WOKcHW-b!+6^_t8~zxlfJ#6hygIrT+0@Qg#7Sw0+TkQ` zL5afH(pDO<#7~kdetsW-Kg==?`kRm?_(J03pTaD91Ie{zL0%RLr{5!8C{h0cmVb<6 z{=Upww0{P0&6dfo#-?c1bsLcCj=V`xif|s~`%x9uPz(#Kx@tp{h`C(8M7;Fe1|kWC z!Qhhvut zD{q5~?z-W@k65JU`sK1efQ^n8rXRm!LXh)B8sw3pUJa2r)MoZ3S2tE-o1bH5?mBq(+IG_Pq;*p2&NIs$Yt8cHXt*+Zvd9(UfIrTt&_3@v{hx@77B$0lk$dOL@Dm%PNm? z_1`wBE75aALd$ID8(vnv(2BrJS2-mLx?k6SA72>J?$=r8Xht{)-`3K8=KaMPBfq=H zvsaV*8-ftP)$={~HHw?SoJp;w9EzLRUs@K(WAlvNO;<;PL8 z9tddSQ6KvrQQ^gdQ4sx=ZY`_`j)VY^LBCSV_d4c5K3x4y*bFz@w`z^BWk49n(mn3l1M(= za0qgRcW3`tS=}pXrmF{n=-mKrk{r6w-dlL_UR<)JD<7V6{K2EqC`s`E=}0w9kNHLB z{d+{@Jf#a85 z8KK=>UY&CLgXh@kPlKBBqg1ffhW4x=d~X&ejXoe()c0 zQkb@tF>7M6a`0lA-L!@#Uk%l8Xxb$k(BfqvaSzpNBQro$!IeP8U9u{L zpq)ix9x%+*9AbpTkvbuTx+t`Z3L76q8Y}`J)hzh4QDVYaKj2ioL3{SCF+cQ0(2;3- z;D9~%i)+kXzLcDUR5(vYtQi00zcBg{faxt$|DU?iUa#`o-TZXEOx{&20l5AD>Js>W ziTRE|QzOfHgx^n98v_#*E>94ozGdTsnFBQ?_i@GdC{Uq{TsUDdhRUe~Xs}A{m>Npe z3b-78kyv|_pr?`X0DfnkPorY?w2P|OY(%xB3m)OKMMxxpD@|oJDkf->Yc@W~T?Bwy zXbb>}cG`zxn^mHil;wf$-qGO0|8_68$q|;2`Q_s;(*L?u;hz&z*FdmSQ(1xD#TGEC z(jc2dA-H4Jhae-`Tdv%1t&`*Fvqy#QA|uc5n)@vm~_`8GtUt~l~ff2w<)i4+!fZml*j65CtfRRg^v4j@KH{GQ5=Z)YbJHgl-ntI7b zI{;1!CPd;e%?ub;^)0kyKhpBS6lS&^Al90;jhnHZCcCjU4B}EJBmy8kER&ZXpZY8Z z02*Y@Uieo6@QMF#xBkDx{Q&(@h-3`dcqh6H@%2#B+C~MLrUHhgDx(eYk3stKhOV?t z>3h$o5}msw*oO?bNHuIjn|q6Ey8coaI)4`jEG$j=kkzDk145z+VD(ynP>#gDzrSxcz{y$z=75paQjYCLw(!q5x~xjT z6SM83lFRGOijzt#Yp@I!iqR`T^$3jAU0{V7QZf?`ZndP*CM{uSt94c^6I?%Q_CYvd zR9}uxRAS$;MpSpOs(c%*00>b}WCW)vwkS2c&sEfKAQ^N40slrE4gSOf@LMwLK8ES%6&3)qk?>qHr z`=ySL9|4OcF0jfrO;xzFa7qU_zoyq8J>YNL4xGMYmoiWpGN4ISdWOvBl!7$xKrSuQ zg}iX-ngQ0?Wb0(KM^cwQ2`aRc#9(P#@Zpv5jwN zJV$D&<>upa9eS8YmLMnfv=2moQeEJ)4ew>51F#}&tl)|KP{wr<`V(~ z&)op7Uzv*VL7oddLQ9ce3OvD0wexm)qOF4eo9Z++uW{^yx z%voTm4AYdi%tnPCQ41SU6@yS-1g@fx7$upY#pjr*pA+r68n6pHh+0=O%A}I*BoJci z8M*)*vpJdEo-fBPhC*GG7T9_QR#8H{B*~~%T(yBHwgV+;!FDn9qm`}*{p9E{Z#2G0 zzwcqIL|(mUZgJAP>!tX%iJh}H1*#V~)r9fmhq64t2zZ-+5};Oq+M(b;hH;0Cc*ZpJ(*rpTkP!Y8H7=s={n+m`~Hb zw{21Yeg6$WO^zn*2SRSG<`jX86rus24hNP}tV#!u@pFsOFamc@0Y>EnY6gyJD#Vcz zf12VDbWGX7jh58WfzzeF8|k0b({`q@Q6hi!d4l#GOcOu=OW(1`iZ<+$1r#%X89|O1 z3pn_xiLh>2M<}m!M z9wbp~?@7ylQO>Utt$bOhUp-zdBi}}EDq@z{q3e5^f2$pLu}lk$;l7e?rIYM!Aq(&0 z38}4xK7TC_c!yfS#9{(%U>*WNnfYE+hd%0uR!;5G!`gG4RVykgfWtvrcTRY{J@n%0 zp5}@tqSzf5fmLH=byUmGMWMBUr$?2jD|mjAfW{92MS=pVswWOKvTvl=z#yn&bhNu^V+4SPz+N$ z|1cLdX2DhoAd6}!fGvH<3cf$BjA7gUeg{@fY^!0IDk8y2IUr4)jgRsMKz_dpTYPSV zP|vioom3)uBL$;Q+49k}KL)Jq?sGBN*+>XG{}ou+;3Ay50$j53eozt%xT@0StJye>w!w1Js$G4e+)M>RhewYxI?wa&I$5^ zCO$@m2MCjdzQ~gR5gj&V55V)0o{3bg=|2_tFC zAWLPHf$Qi}q1-q)`MnqP^3=78F-$y8?7O1pDsX5_6#gbeQNqXiud3I-KaQd94AGHu z05&A@EA@Wm24;Ft`Db5EIjAG&>rlEtRH5w%>Nzdt5hENcC5))1YZr%Yurr>Ra$v;* z!5qGxIuqN^_akckpqg;CXw@PB0COS0Ut&6rX>x+%78ZH#>|(D5U~?Qx|R9)nCQZU|=q zoyo?WSkD7CWE0NZ_=h@k%kU}?N#cU_6L7=EM}o4fYi(n)gGh4U5O@!fWm4{tE|gXk zujHeMV4=rDR6&Shz;x1Xq4NCX#Xo!wHZkJYYDt{HXY zN)`az${E3LsTm`;=>FQ!2sF{{De>_lKORG1n|;ofJQ-hz@2+{ULX}YpN=cB{(G5-j z{nt0*^F=KWCuc`&`p~YJTh8iK<+J^mc%#XLO*i`6c}=ZARs6IKZvgVfg`hY#Z~6D=Q(#4CZtvM5aW)=w;}<-TNNsP$}KUU`cmDh5O)2U1-;g2fN$aLdwVD zSiMa%-ET%rC4PN&d0BON4Q7+yyAyI$xg=mj6Snvc`+msBG9@p+ zbxkOGkZ<%a}skOFSy$nEuI#ZPZs9`le2MC$Xp$Xki)WvjKGY4n7c-b_7v;TNXW*6k!l0vC6 zm9I>jI`l(_@lU|)LO0~yjC}s#+z*F#8wiH?w4HfbMc4qP>~N}zYByJ|v(T;0kyYn# zX7yio49s1sZw)%N&D-Eq40u-KpRecH{XAoLvuQ;@hPNa(vStmN%TY85V!M097UZ5l zs-}@)=SX+FSaj<*UQ?F{{N2$98I0SZN0r!e7U@r81l(g;iSnr!4IyCX;Iu)$j&=qL z)jR=X-~_EkMufrp)0Y9a0tsgGry+CKY_Ln+5NwW?r?J7le=qc&M`#&)YN3*aN;Ar| zMF@+JP3i(rCzHESZUdqyJ8Zynj~&@g3pJ2P_8X-VPB7`JB2;3EH zd$woqeM;~1yU)Gnx!b?`Px)p|?|R>NeTGh>dGVT_?I1_J(S7_ZJf)>wH;+8-4i8{^ z$p9fq%WmQAqnf3kU@2cLf^1FsU)KcGl(x5*jDy&H#&#TYfZ&PQBKoXvBfqHDA<=!H zEo`n(<(E0DnhQzeWY=+fEWCYu@oee+gO?tRUv+)lu_@A*#5Rfy51kgG{m&(MhZyEY zh`r{c2PLP-A8$dkVz0Gyl%ZS}XW4?t6!+FZrje%Sxi&8s?h)POCS5}$Q?c|AppH9J zYl>{Abk@ewMxwjqKeyP`mB$wCm9w~AdWc_h^Ki6~rA~P=?r0hx>Jo;|{QkLy9WWkAtI(Zx;qs{_C6B@$3HJOBl*74X^j8C0mJPx&x zBpQM+<_V{n*ovY`rIOdzTg-VDBa+LH-n2hIVVf58E2F4|*A;;hocO7}IYib@+ui1Q zFBqz(nEP;4*|2>as^4re0>}W$3>+5c8tfgNDnyhf&GdxZi^l};RQW{zaqsA*K4V2+ zd0{khd@K{5%$?}J@1%{o%g!I2avT|%-cvz;&B6?dU``P52#Ep$J6$>)$Q0UrF%_QTRA@m`yfP=xzqMf{zx)tznyz{V!4bWYq=W5>v664L+vcww zhb}@cNmbYM^Cxv<;OJLLyfe4DbUN~b&eGEr&{T=ysb-`u>{kc3BUs(S#P+5z%9N*s+|!)QZ@k%l(uS1brZ#XYqns+jnuU{(4Oo7`T^yOI1u#;^fntN%LlNm6OAJm*j}-zNC_wZ8;9{ zrF1%&g6>$~)w1gGEdz4lMwzaw&(@+6uLtc%<_$L!(l0UNE_}fMX=|ZcuqR<~bEKdA zg?P5tIdsUpl`@p7N%@rW`R zDOtKup8C0xJ(xgZ-OoDN*z}UP4K8&@VL~X@X!_@LRq5rEar`GVe;Sk$pD* zO>?-EMgbOPw>k)7-f~!8mR!eY@I}S-7wzCLkoKV8Q^)K;safioQI< z7&w%=c-~4`55^3x72-fy$^2$69kTHHg<&X1hUPRG)m9zcEsJik8?mCJXcJ$AR{wpe z(xN>AOtg%_s#yXdEOd5KQl127&EwzdY)e|nnib%j0YCnI}i`!LxdkSK%c zgNI%=YieTrN*=~g)FEdbE-L8z?|nqdy(53-&dg^n&WJ>Bxwak6$LR0?(e?Ggyr*~3 zR7^Fz=M40~uDO_+IO^G`?&;rHDk5ib+N(V}bB~>vrp9BA(|0za@43s!tzPS=HRCi0C?C&sF3bEa)#ndI%g)W|^p!j4853UGpIE=MS4ZN?pUmo* z*IDC3I!!wu!AN`aRoE?CLLaN`V5bgzbqek1V!$?bxV_%WFCwG0+kBk0cwMnADdY^4 zQ`PFghVrw}$iUvlUSvjvalt&6f$tW;YM((LLhEvz`(=`h6WL=rqMkTI-enqhh65#V zkP6kNV0H0f4yx38X&cs^5yrK}QH3b_ms-e%_ScR3Ut79#_DtP@9%bS5YnHUMlJ2L7 z8m*BXyqiKZ!n~*f?tTWmyh^;hHRz`oyolT{>Z)w=(`w<58z zet2fKuV_Ff33;Z)n&Cv~6dvTpGVz!!Ky9@q2&FN6`NwT3Bb5C!0o$ziJn^^Pc({za z4pOR?U|Z$SyAHFWUKMh0$MP62&(-!k=zKc&e5-t6RpcMrETKamY_lf7qsB&8!`6O+ zifDHZi80P)DO(<*v0f*gC>?KvWa5Q%%3*q^!+qlJel(SD?}U7z%|SyFMrhM8_eJYX z?X)+}7`Fe?6$T+^OoBkRw~9XWBH~helU~_|)Sq`e3(j|6YJML&2-(iQD}RLU+NAn% zRaMmxOJOz+MCP8wj1#iGCW%km=a2ESzmZJftMnAn;lVMGrEe1G$7{b-{eIoZiPf@I zV6O#W2@VRm&4Q(;Np!klGo0opOT3o)1=%?&^75_#BX<0Kp_oVr9sI4dk{x`2ZlkK* z8`Pl{krhSYOJ~B^qZ-3UqzxvT6|f&?TCu_ka>bb9Qk%E z-BmEfrsPEmJYTIV4x5DWsv01#Onf_qmurx!IEJorYcUu;ymdbxzMb9+^5^kwS_dc^ zJhY*c3$!^-exASGkHxFwE%XuUM8Biu?-bJ5XW#E&oA5>D|gg9`a?C=Dg+)+9&u zcUo*qA3LY(J#3uw9H2-=Wfb#4RB{ygzPyZ2zA>B>MT6UN2+=y0H0P)`7{m3+^(js1 zFeRy)nPN6xLT7SYFvkykn zsd*R`_*k&{lqLq8*t*@>MUzrq#hqiTu4PW z6=R;z5<($Y0Nuq8VD0$CKJ_MMLZxCN8i}@jfPcVM5gC%cszxNEmNxy>VIm=!|Z@jo|o3f6v9)yXvLM zxA2JM17sR6AZw<$JFFCLKb)4lAzI)UHF*)*g(JTvFu3>8J(4vK6Oe!DgdzrlkbRDH`v=x6HIV z^axk$l4|}Clm0y;2715~iA(F{9{2Zy9-vjsHK3Eqr3Y(T+l_neL$9vA`0T*lABt4ZL$veZO)hT-1?|qehqxom9Z})!d=?>P3gtPd+Z;|g zs;gG@P!zwt=}5B&#cwM|BE3)+PlP8tP^_0abkCNFf4GpuE6QoQC2eYRfMy}4nM;Nz=DZuYt@LtTEe!J*<@5FP)WHm`eBe#E+yWYunE z!D8Je4v{E{;ffk@=_1FB$88#pKcNxa8)PqnS$SzbnjCWCa|{^j^^z852;^?Fpev5C z&(H#;?Y=dfF?#iNK^{%;D}LC2X%%q8L~)SX+xT-gqv}PLXD-vGbfLXX5I*;_PGeh0 z#av$S-d>`4w;+6&k%6LJ$vStXFQ!o<38^V&Ro$ZsNQfpJ@A@bK&-i<3wfJsAWcb^* z`oXjlJiNKzd{&dm2x=cwbeG_8!<5h%+D|b#sZ*t$gkVK1Z$lESx)uH;tff9xTT|b9 zX?Y(8afX|Mc(Z5d6=tt2rL{G1`$Keq*f~#JZr=i}khzMP$|J)IG4scdKCz<%y$CMI z+&o$*1Ba*cUKrvR6fT0eUFzOvMfOOMQLCb@bhz}O%#6tQ6hY(rH8dR;12||mQHq*S zgspdO;Han-gD%&4gYCFW04=7X%rz0A%ta*E81&(THTQs(B;L!ReEc8~D) zMVU1Dbh#gz;6|#!>bai~@?B`HvW}6L)LG$hlhFn>!ZG9Ed_t2*!P#Y)6u(;bold_P z8(-8aH(j*cn-vIGw+j?K<)4JFmQgib$d`4NpjUHNLF=!B)=d1n)(kT2sJsjx581T@ zJv*}+KI8N%dY*J1{=Dl|Z+=IG@d??n{iV}~CL@~c?*9C_mTaEz&`J;}O7!>$vg=?! z5BiJdHtUiK)bn60fz&so9q^HQ8Q4-0a&MWwwK24lbgJHA%GRBc9ASS@Zl~DFg@sMT z$Tj%@juZszTsp}m<$bt6j;=lj0+(gd)_q`HVB#77ZYx= z6c0ii>S3eRg5~`4Q8Y)ot#=wtIeH*A%hS5bPJZmRL*ZP1d;836tURTZ;vy!6^&k!> zMn-JdJ3f1xGWrftJ$bpO<<1#I>(Wpr3nz&gBy?sdwtDlNrwWp=>ADnqscrvg*Y!Ae zl(ruI``JXCZk@hGsLoy;xpv5MB(tn!@lv%Xv!#uL(Iv^Yd9k+Mj6w3y#Mb(j-YcWW zPdx>j2(}!`Y;<6Boxd9_w<3Jcrasabe!8WrbZLQyi&n4li7EAphTDp7(IfLkfdu)2 z{Y?AUGqW=#+&9wMM&tI7xcsQ+Lf9KV{AP$aUaC7wIg{Bp@5*=Y;|CHQ5qN9zQ9Ct5DKUV-NI6Pe}F-p0TS9Ot%7_g3dkGb$B~p^LAa76VHwg`16CotQh=n#lV4dp-zIUF8b;==TtZ0;+~Mm(<&%CWo(_!_Hb8!rqQ4H_A4@Jbz5#=L%Y!oV$6T-6TFy|@WSXU5!v&3PZbiAv{CT_Bv;ueg>)A1oVSR9tY3d(dn zpe7a|mu%DzP(x`Y$sm&3L`0}ma z!s;8S+j)1s$U@N@pI5=NJngGKlUCvS*sk*hd13D}g({jYeZ|gfUR7;ww8A$=yx7)VrW=2I% z+LufWJd3K4U>R{;4BY9(ye#zNf>=uGV-wF?kloOdXL&JTOWlg*YeRF25rYWB%x#pC zIQLtgXk73w%j!Kwfe#cnoU|j>jaaZ_y#uui$^v6b1EN!BU!}1|lzo2CT=AdT=9T2h zQegjwlNS4X?e_$xf@&cV?J5(sRS67At7dM0 za`uK&`1mc5f>lW>Iypx;at50l$5{RLUQoL~=k3Wj7Xq2Re&0s8>b&>0LqjfB%}+eO zw#-D*V~S%Ie!L*pOJXl^i$WiugMZjS?;f??f=T7+e36p{rE|@jGwfdzx3c`~!4}`jX{o{@PLSu_Jt|Qy$Nt;7b$B9gjao2(E5F^%d^Y6DeV*}X9$$V&+YkB-IXiW+W4qxruA?O}8d6d=OYtf0N3R8-P^7_%I8DSBH6(+*9lr~<# zwjFgygj*|Om&2%6r;sskGB|f;G}&}RFCLIXc$K!8&+PWzU?%Kol-Wah%Dr@Uxajrl z4hcVEwx!UTb8|b?;d#U;h)XqG)5U?RB1&J7IuZM}O)v+7((fCI(Orp%nJzFTIfjsL zHcXD%ZY=V<#6s{CwgnpUB0>)L7LgVkXgwMbPYVq#$5g2w;&U|;HnC&m2Yym=xSGyRzH32664XBWKX-1Ig$TF1iQUeACqg(+DvFFGUD1?Lm@{eI1=l`i{%z>`IWJ2EzGX0F+%m1UY7~SEtPD0e5C$=i zUHV&TdRD8b2uXhKur5M_joz0T&OzxJ`q?=225DMj9ba@3V-0hnISiC;Cfb=}rV-3* zIZdw0QiQcoZ3~D&P!6d&!B*w$32GO8~+c_f39fSz}eN$TF6t2Br1;3oSKp!ZwY=o!NN0bKazD;goEzXoyHdtGp zy{tu$vM`3(AkW&Hs&F2+U#j9w)KOv~Hol^?ewkWGjTey)Zk1MC1Y5$BA@c=`?d1dk zGf`t)Qr9~9q+pU1FR9zOEK_R*@FD3zz;9t0&t24d2ePZu;d9K~LleavizO&R;7T=_ zCtZn(M4wCMH5kXrC%NeZrUWQuS5)gvN6b!ZI2!UTjuE);kkBy#96Z|fb}iU94N;?9b%C=Aw^fkm8li+MK`od3R*X7lbd zEX|nU3WV9{?+Z(WM6jtQ6-&jXth=*8eTYo6zUC2rv9*YzXBYm4Qe3z{U!y`|mWX>{ z*Hg@#(@qlh%j3FW@JVspa=j#0w-sgBVH#WZp9-!*X}fS=7!)odW7`>b@pXnap~|Eb z+AidZ`)w;*vm{YFv#f5D0jNKSDHEq?*9rp1t)iSM2jYsou_K2gN<6kv8n6$iu(ET% zCjSJ^?jH+m2uHaF8Z7kyU`e@*yrifJr28?`svH#KP8d7sz(jw_xK$g9rgihJRN8bNm28LkgfC zH-3LrC`Oo77JY%<&RqDKC|WlNE{-eOZ!2Q_W#UD0A#$^$$#V%BR5V+B zBmh!wswStz%?4Fx#&M)IaO?BXwB-~)BFgX(Uii>WJu}zC_Lfwy)ZS52EYT~H4&K&Mmc~QT`x@}6aN>y& zJ}S0b;N-_d5t1e|CER!#IyuRxEz4KV(0+CW1=$~Ft1*tk+So_X;$`}5VY?4vNqQWk zE}to~nUx@3gJL=`v}hX?(~fWKIWGo%8nJdCng-vfA5l6gi9NI^H7Qrnre5T$# zWBWPVPh*KGUh}yU$EbWs)}W^@idh#>-d`0w5|_x@p0MZ;*E729A(ae%&P>1;74npy zZje77b;dceB}m560DI2{5tLCFBEOvB7h9yFmU*G|@g1iJ!Eefb11j-?a!GG8?i!nj zjgO0sja>)lHl_TM-_=rQ>{+kKkXG$NJF|nGc0y8h8`192uim)M-rg?nJr%x`w0KV^ zlYU)nAKHF{#AV*nc@WQl?285b_J}NQ$wSmVEN;IVjN&jepwWmoib|bGF?%A5njFZV z39cV+i%nN|KEA2CwqDv6Gcr6K=MdV0&Wwu=rhOu$Gt@H~16Co0kSEWryaU6dyKFtm zT6*sZ#L`7y8svmQVNeTlNerK`bUGK+FN5|R=NU~mS{>w=S4F}fpF1d>VwQ%7r(_J^ z7VN$oXX;U#NU++YiQ3>z?Q~=S#W%0^M(L%Djn=}= zBzh$kN5(=vyv^tlMz!-lArudHALL_lLY!PNqChyZbeeHz0UcJdU37Gn(KWQ{5Z$2H z+-aBI`fEYh_hNR<3}x^RM6=RC6SwrTZT`akrAN^&;~U!?Nj^ds7JD%!aW?<)TuQvG zMwGs^rxBeg6_}oZ2Cxp#q)EN-<gj%8;;v;V2tLar$kBBiPSNo z9`(i@enu=E)mq%8sdHcpR0=}?+Z!RDkDheyI5Sd$dXa)E488jPM>3np3V~DU+^y2VJQ@T50c)e#9sx+63?juUmD`sHw7=bgTg2lV4PmqiI1FJ zW9hbRG4MO29$<~neqFpd3T{W_J`j{S>AfUW&|ao|cf0K?w77UNx;CMe*azmgK;I%G-_0g0U+FB@5Y5+Hfq{UKi*m6)NyoW0pIVby(a~W z(}nI+FDG8q@F8)=BLK!$&-7Y=LF7zAfr<)G>2>vAbdvXe6xWnI2_U7UMngP#;uy}F z2x=S*7Cc-mBMc>+4^ z;31`(s=tS_$F}x2Oz0o_^+84q90a~D*8PSM6!KQYctJqm&+I*hnkyquHA!!tW}_CX=u5Du#cYS^DyQ9sYFdRsC8jtWl^-ci zWVH#+abzn0tT?e~t&qw$RVgz2=dZh;6LNKyW_zI+yZD*0a*Vd!?8}Qz0Bxax0WekI zlU%waPEDB+aDZm>9Cq%K{}(qZ-qeuib&iRfaLG?XHr3hCd5R7o!Mo93LeFvuFtRpp zv5g3U6fy=!B|zpXDkQa#@oH4kj0%npDODX>Ww{a9l1)V@l#vJuv%$((#=`x{ zU?h9@j{5~|3nLsaYJO@*x@>uhUL%&G3zsIzi-_`@dFfg1MxM7BjL|p(sy!+MS;*jw z#xs5HOdC4AI@IX~v) zkT?V0y2r+pU6@omDHWcA2qeH#juLc-*=QMi$By(TvSj+wF{;D76NH?9kWUl)EsnYZ z0Z&gd%BL@;7yo3$Sv=2dqnYEHsQhU0JgaSk1&%`H$B5_GtMI;lQ0yN>UVPfC)im^c z3+o-pWbbdkCr^oPQo3(6C*OvoDU=-f#ehk;q93l+4njtRYdqEX327=5ZaaUgbWZ(? z8;3^HQfDE4;wX+(E6KS*Xlp#{u;^S^wOCEp%54aWjf`pO`{!SB9|B+VvJLnirSmrq z$Hj^t-zO?bE`X*n_dD;$sA|;jq=OU>U{%rqXjBV!ZuQ`399ee=95KOI6g;W$%HxyM zL`FO5cB+(4N;SUPU(D+cnO}+$LllEc^m}(l%AncZ*`tz1RB==YypX{jl{BHWqC+r> zL>uMNF7~foCu|yuiv?~9%5Q&n_h3YE)kv$sAWt~1Tw<;#4LfCPMPV&q%;^Z&B(jtuQsM0KX~dW>g|KHnid{p>DT42_>mXZ zuokA47Wcnt$h{`;oNEZ5d^2jJV~ujV^Vt6G%M<}E5ZRvu zvRaMWBrMR}6-+5dtn!C~)Zg`p4oVRBAa>3S9LU`x#iC@SnQU>uQ?R?2C|=;g=U$nY zF8cqsMZE^T2__N|2VU=EAq~TOBG}H#*X<9Ke>}+dH_DBQvv-4Q#5LrO9j;GWIf~&k zDX;fJnwEF&eYl(vwfO7OS=R6CwGg*O1vsS947_?3mji{?#D0{cDdA;`V&2gSITYjN zE5aHZKj)EqN>aw(k&CQ)Z5OY-+dhB)ok^qe-FO*&KT4QHRV?qy>T=0mdpR!STC|$V z&%4Ikou5174m~LL9)vwm46`1^B;6-D=+|=)aZNMt=t6{h1}4DPah1yXigf$#H&?qR zyg^{{oH%`Gw=^KORptC{XOVlEN21|cVNsVokdF?PC>#F$f8R{(q)!Jq0oR2n*cFjS%oj>_J+hO$jb zhQwf%UvA!&?K!%)eamX3M<}q`I6S{w`fTxoqyWzbPvtLA$v^s6{z54zFOb8DUT)+> z&O}~BAMSx%_1zEo^50F!{Fn3v{qi!_Y83VMX=DL)0RxZ6z9tpja$ ze~~v~(WitAj0c!YA1i-Zvs>ByUzNI2Dk^zK^9I>_^=dqoF{rv+HFp5kEBHVqZ&$m; zRqOG_ea#3xxk0l<-~8?Ui8%{?gU^f`oiMPQU6XU%GQ~&AKV}*G?|$FETrjmEjf&Ta z&6z)bUYh^%OY%FGSy0%&`x{`4$;0>FU-so2KnZNWy6lXkVh}vzzsJ+Zw^Vt_csc3o z;Ti8w$}$rE{D*3}yGMZynTpEKvAyB9Y>)b*UCQEk&RTW%eho=~Z-c+HZP^gC@R zgo@?ae>aSOo{B#i1mDwMjQVeD`@e7)|LfKwW^A<#*~Zlpm|RoZsXbn}rS~TXWI09p z<@@xmO^Ca?w=`oO*lCq6JF)eYRx4v^+5Pz(kZfdIKN#KmtBT6fjPt>-eFBbNZQsH+ zQu)rgFDd(8c1ZfWIIN=Ctc;%<+Fvdz{nG6|UN+IY<>38i5$GSbA3zF&?b|&2-nakf z@2xCeFMs3g%awR6tZ-@^ku6 zIC%de_`eaD9g=~0CNg%U+CocN)t`%fmEVj2Dr}MF8|#3%IcMhwUrSMzj_1)={-i>9FV0~Q zU?j@+;G=ylkau->k>(PqTkeiW9|&vZ+jlDmhdTHtx%%?oe3z&xNoBx9CN8$lyMdO@ z(0+f8np}Yla7w9SNHsoEyISt|qNu;b~yOtzu|2iQX@&nw*b+lMcWDN~g(FR7KeTH`|&ai}8 z;mBm746cBl?@Do6I`TJ;5tvoazc#DDm`s-U!iFpy-uzQ*cSHB;-ETXi@%AY}(N%BQ zgH@;89<&Eu7qM`_U$R*8G4F2taH6c0mjXA7q@=q$kTSKW;y0IO zNFSh2oxa-YvmgFOc8I){b1!$GN^K}j3l6m6p=V<0`5@=~rDMyV)Y$LUDI`N|r*jo+Rd&fRLg zi+fZ2T$>TNS)|_Dt~zuP;gtjso66Ivne&%sW^_>yGdF+E|EgW0o6qg&wH(%N;j0Q! zo5Aqiz^x90X|Kp9OTdTPadLej8$F?okS!LMp+Z?U6xN*6hmBD(tybkkow)km-e%A8 zmL~pvU8*EpJ8n{ZlhouB?4lRAaWFdMq>f^?snOk>g&sJ{VXJ8EPGo zURDlaWYb?->nBe)&HToiZX-qa&X?3oaif>b3XA*Vu|9X{vMB@5&PKCYWfxFJdes{Z zoA*|5i(}lttBcC{M}OgCG3slDIiDH+2qJIM`b(gBzem|;TfvY0t%B>(Tye)_ z^xJ>c_j_;q{?>w8!OZ^Nx3Riuy~0B9{{vGR$EBu5`Mlrv{QuMV|GA&|-v0m3mQuFc zS8___XF(2#DVdI-pH}9;CSoh@f7joaGnbvq-9siqSC558o(~>J+RyS<1BRt7X zN>jyq>0JwYkSr$T6yV z;Q~WFXvG!fs0U#CXFk7$U_x1a7HJw*NHP8U;VF%Pq$aTimNP zudp5R3(yES!xwVw{JP1zILFU`W+=Qqt2-nb4$7p_A5QX&b~8tAy+`2IZT@lv*N>6| z@2zgBS|{&%;Fua^$54LhCg0wu&VsWvbaI{W%g(QEN_Toj6tnTim$>I&79Hdl2mI>E zy4tTAwYS2C(3?nH`uW7;`OBO4i6IP6^%!j5RwN*vH7T~s&7^J5J4v3%R3fEcOD-go z!OBHjpT!LZdvYY!@k%sXqFX|3Zr}Jksl+65lY(2^f*l!piYi)6>XFK^0GzB39Uik0 zdGjET8poNDMZCsAfDW)b|_d=G0nJt?rVk2N?Wj|-KM%b}kAqIO>%7GPN0JAIdm zrFG7NAa{WK1DW%mZ@61)g@yO2l|%JL(wu9a{^!C^4_4zE`jM%daxb056H^tJj<7^VmM+6^g#MtMN~L<6FI)4+iVY=++}Z}3k;sM1MkOaVySV{ z&;a_S4@u@Qu14mendTf_fa*L$@w<)eg%(cQk_eDNbgzW-t*9MnT9m*8n>K3l?wSub z@<&Wp5;TK;0_;A9L3Z?~_i6%Nep0=*tzy&B`$k2pLmPth3gf!Ju6URba{1a?VZ>7F zxV}z>BD2dK?Lzs=$6nf-5S`N7;H?>i>8PVDA(5=Pg2@a&-vK@9RcxPCRDWE>f#}95 zH~BGxm#dX-GSyG>v{HYjC1E!>Kq^p-eel#@Qa-a)60LTXhO;HOQj09gc-K^OECqI8 zO`0}0EYOBhpqhaEf16zDslTGj0BCN-Jo7;5=f1ICU4d=;`I)`_zT;*tyURL>>&#g_INa)=<*2QnUcN*_IG|tKo_@3wq`Lu?f*tQnRKAzt{?d5yttGrq|YFu+e(U;B< z(T6It!XtpU!nI3;cZ5ek$?Xux1dJ=<{b7@?eTzArc%O{OH{H>>U#_DJSOD>iu%tlm ze3tCEs5Uij5jTXIP8ClD!drjN#GW=Pl{ISWW}S!^mP_Dy{EWf*peUTN*HHWj5tfrz zXp7mCQ4bRzJm==hi+>INz>*4%%4`$aY|NA-KOqbvHO(A(fH^P*xMx!zbJa?4eaYR} z?9;)8Bhmw+70!`vbN)5EOeXq<4^vkaIeq_#uA_@jV@!gNfu1T^dTc+Y>k`_dRj_>o zKi14>Ql&+35*diHBSRAbrI=NS(_;yFqeqo)6E29P)4K30eQhvc8Wcw^Tb>Vd`Iq!( zq?nTpoM#vlQdp%?6CLlty-sfoTkz~}XQt4(hzJcTbovd(LCO8x_J}IDgsR_`EnJic z5ZK?CpU8MI99a}xxHqWq5vJTTYFHM9`@)d(ZuEB%%z8ldtiJ_kvs^KrO(Gep)^vqq zuh4DAbp@fTRm+K9Emb}Nd~7RvvS5c_h300}ESC=4v%Czi?`wR1;2*dfyG5PIIT}&p zd!d_xHLf`6ze_9JWjsONS>IX`O$0s&YFSiWo}(YSR=zf_RsOQ(;bax43P!7%G~z7t=s5T@>hj?QW_V*DafW~haSk@V~=Jwqymf^)?rrb%U zfkP!hXRaXke*4gw;58{xc?7FBwx$nFL@jyqGt{Xkyx3n-E{R*uy60dk`UEY)_{$lx zr-=Q&E2z6}bbEmsJgOqcC1!U-`&^7;*EfzcxflCKs$Rr<1TN@RtKLidwi~0xx+AwE z{G8WcNJAMy=_i=^)ah1vhz30t(i$1wrnG|q(@^3XF2QHvE-_OoxVYWc#*Uq&yA7pR zH$@>GJfdCs9th)1?*kk7l=#t(0V{h(W05}a7ehTO@LEs(omA&poXR%I+?06;d;xk{ zE2$iw5nRYtShg6}$)94WeLzNjNL9(LGd&m}8ZC(DeVfu#k-^4Ep!dZudge}RmOR_AdMV*pQe zIf1gm>st#+2<=>LnPF6U>&A+yNgL0Kku$u#x6>Udarc-icJW>dC!5Q@ew@D@+X7B_IVE;NzMFCFic@ z*-&kn49hA>vpH9B+D(h!eO9^XGsJ6oBAYCHnU#I0!DS%G(pE=D{OlG%Qt}FAOQzz* zh85j1moFsMsT8@cE+J7yMuBN?ZicW{ja-?RaXAY@CB8L_aqA<%R^!InB&v`4`Gz?= zWOq!36;rj;!UbDoeob*{pLJRW|Hv{D8%g#+g>=&9NU(UwZf56vz`j~odmZS#21j$C z?e-i>x0(F8orur!1>TEp+bXO`88EA15m@#sqn!oH@tPW4vLX#14sWRzKW_BbF0Ag( zl>&~GFKhHVU$3|Z0JnWjf!sjHQ-upZI!jj}S{T{`v{Oo8wKqBqA)@D~)PR*_ec*xG zzS2!C_v-EYMpgp5ROc8t6? zH@-vwxI>EOVuTK-WF4;j#bP7H^yF~qih{;P<7Ui0qlz7VA)QasFH}tCJpMT6QcOfE zl{mdj+Q`Ka`KRCTjVlPai1nBAzIMGl>6Bfppu6}SEt^u08Lq0e=tBnCh<6S|C%Wmu z;-6_!>@JCq1VciN`m<8qw%3{Wd#{ay(z*xm#^bGFGXJuu=OupFp+J(b%Ag5{r&TDf z{69(5C_227(CKL0T;)Z3x}QzdBU=?&8I)`bE$rA*|61jTVd~^rXQPqf$rjtSN$l_P<|FZUfYGQ;T_cd z%n<+Lc_*0Qx$p*;q8m1b_`3C)=l)&9V~B#^`!swtS02Vx6*BvwYFA>Mv z8FWrEM%x$!EqW6PHE_=k6G!WdYWP|FyMfiylt$C}8^EA#*Y=-@GrsI!s-zx)t+=l5=d@)b@133q5gAB)~7bf_Dv zUtv@52kJU{HJB*GWKSL&1G5ltN(@>r%U)XN%6tt6i#n$)$nt9^X}FZ zh4LXXBI{Luxs7&P0p)D3=EJrV+TrKgOI{#;Dd6>?ZTPUs`|TdfFKR1jY0Ks!*Ioz@ zd`NRmN1ekrC>-}0<#pBZ%trHjLyg*Q`&A*1t`%1B`ouALjDgVPVilv3m2DB0SA+;a zegoJs){TS%^QK9L{R)neuk0v14T)VMdRvUY=H-f z?r25KcRA4~z6zj&hw4Cf(n)0l<|7;@Nlu$~bh%Rf^FT1cnIlb`^aHlA20I(^4w*hD zsSK7TqYN}>+{Y_rN? zeAns+O#6+x-@uK4SK=9#~C$hDA`jzCqI#jFo=TaCUL)!a3!@l-giVFPsr1 zc)N@Yy=?{(V>hFAs(Pg5xHWYW5~B(0$QL_P-r#Wz^_=u)2}s`Gce3;Q&0-g~@Lv34 z@+r?FZasI-t{<@4I{UK1C#+$-#wSntMt0FNme_vOz11=kF6*8hNwoER_sUwo`b`#R)}_i8pbc^-ysqMp@7QoHN1{9&h4)W2DEl17-}hh3fu^Si%3t_HLUMX2;XMPG z8)`d{(%tgL8R4udCd$sENqdQN?{k~Q0ZIvFJ7VNiaO}@>#&;9xAv35CDyAn zR}>KP@4U1h^}AP<_mL|o#QY3C!FJs`di7jw`xdolDY-7U#usbvT82$hj;rmEODm2) z6=(+DNx0=^C8gT0w*lnxK4e=akUZn0-J!hD%`-nE|I!&67#N1u+$lXbfiKN@!96*Z zYvZ{HCzbMBZbXHTEeKlki1NJ1Jk~Is1T~_H(AQ{7%Ohhn$qX4*Bqk!l-7?FLKT+t} zi*RWuzH>%?ARbbgA@T>&Gi~omS~wN+t7SiK9x!XzRnUc|LV;IjO&!kX^P%uTcxgum zNfBV29|Z#|*h@CvOWx7u9c`$E*jDv0#luR9SE@K&uGP0@pee^nK8#qnT-ww}jPaJ9 zo5tg=HOwWLLzC|pznJyNuPhh1(qhrJ~7T zQFK=&lzucK5&@M>`2bNt^WyAm%H1h<^1$%s2nNP5!#f}zQL=_s^H9(t-uFX(2HGRA zYsxJ+oCsFi(1v$^zo!!hN{_P&wa+baxO@+C@sVuAl*{^-KV&-^E7n-ys(3%J%XcYY ze*>xBHQ;v-=$h$kNx`B_ts}_wfKW-ti)t63qH^7Ysrg7cr>BkZd=)#XTop6|2M_Kw znb88Ob4{L|r|b^zqUbh1GfgY0_o;-YZd#3^J&`k?x>0wHleoze_i=_Z zGP*b{1%tN|Jt|d7^#Fm+0hpC874OU)Km_M?wwNzAGH%;TU}uL&Zdx4dnDvJ%d2x^N zUni{aI@xk6$Y{%GXtyw?vF}7gal|e3X1UZqC`jbTQ@ci)(Enir-pFB#G&K0GFtR+M z$L`Xz|B|e#FnN+Mvcc}k^sA3t>>h>wsnkR=Yn*@waw1GpE>Im(3Rzi=1VrbIj^91! z#@EvnCF(f!R58U)rA)Kq%&>83HJ8J4ZMDtx0$5mM)ad?oRik zCdR@F7LYMK>|48IT;-)0#+y02*VZo3XY9j7yF?Eg5x4r5 z?curPZ3%`JF5+0GWmtD?=YG452W2lh${s=b?Lm72(uYo+ zMHj_PJ|WJs5Gh28?K|0ld!G*%>?cz~oS>!8X!3-4w_qL#SK*BN>{94$Ac?S$d@ZZG zm3ngm?_R)yb|S~(@*J?zpjDcLmBf^^khAcEp{)To?g!cq=_SMqT`LBB8Zy>is*q&r zrjL$qae_&MgCcX*UVUZ$aRxeolhbz+sfb|n&ec!)QKK=)rq+~|^AFas$Go}BT(*IqJtAFOu{s)w} z?A7!Sl-3nA#r|{fS9tJA|DF{ClxJ3ycqo%+J3r5BuXO!{hWU?h%L*?wJ5Ygp$RpTt z*t&h$kXCVj9klt?1iB{aC9vdK_9Kn9mb6(@6S1J>)vswmUs{?}z-rOJb^VSO*KOTR+zvz2t|5U7IXkXdi16)-FhYx34x@ZMnwYv^$xh&XM zvd_HmhemyXOgEW4zQM60*BxT%@p@m*j_$nOM;i_v-F4{dmX7Wv&)%{bju;{@64{g6 zrAS48fIOz(n%@@ki-tL!1fjhe<|Q|;R%r+og;wq}4;Z}Co)@L2^3~oc<}TJ<#{PHa zVdpP(cW&}-nE5^_$udxbN=SRtXtEHx|18g^Yv~^MI`74H-m^u_k*)>fEh;M8lZ+1> z!uNI^o@|T+Jb$aJj6H*U+Vj3&rsJy^1exa*lyz(zg4;DDde2o)YF!+hof)^<0PE(5 zz3nz>C>8N}{n{VO9O-*W4lFuVv5( zA4mW-|6wTfs&2siFYQNDzM0WNl2YPCd;c%?-aV@6E9)P|;d!7l!=)Xa$~CD&JJuVB z$ekqZLkDWTP-`nH1XM&sF5wQj%h-ZdAX*h1fuxoSS|kw!5)zWoA_NH#xdzA$i4Y(+ zAtWJ$B<~kHou{4YO!Ir!@1OTwWx1AXeOGdF&OZC>z0YUw{rNT(qElW$e9Zlyo0fVz z`6+_|M!*h$rI_1l23n0)tdUx~>b^4)LToNX=;F>^K3#LObUbAOAQs5}1La`TLDVi= z;8+2F$7rcLegDEgH5KQSS*bc?*P@iR&%b-|MEQLrxx#WMGEA>`r2*s8AJ=u}n8+ zr;I{MOpoW5UYwiz5DNXAZjk8`lVpOAofMBWePJkxoLaUyk^ksg9A9%d)1Y0>E2loO zF?4gPhNo<33fEMGXDdxF~g_*24wmM8>$t0lLNO?DSh>0 z7ux+_C2TNUeO53$w!+8_Rt|L28Mcdg;r1$JCa!_yi)+Yw12M(gS-HhfVyBwPejvv; z0v*h8R%|^zz*gT|*9-&XEK3T5!;Jf1$EoHB~Q+^d(;P>=ieQy;yf)x8$()o z_1FR>#u%Z9>0CX%CIJm(w|J!7!ZmBQ5z$Jur_I!Aub6w_aB6eYYv^49pga4}bj!Zh zeU!w%cP9V7qV%oWIl6<;eP%o~VnVqkza$$SIR_`Lib17Y6C{cw{1mT6a-ne`HwyX} ztSoO6Cz+%kc$F>7D1UaYbJ?pZ%7EErx%fMq3kqi6rmlz`?v4B=fNo*-&A7@lmCGmW zfL;dR?_tKovD25y!yOR!%lS^DG4bm9lqs?Q?|fhzSfYVj&^EE0qAz(79-u(vR3pww z?Cn(CoRU*0=~K-_mDutp8=I>=RxIR%qwxB>1;KkIZg_C=6tIMfNzSf%>=3;$l+)~5 z9u<^9P!Fm)(lp%5LWhp=rf+_pv* zf)1ufZlKo^BOdKL2^~}I^(H$NgMa5i zJG4cUN_d*mf=H0$D&1&FQj20(+UB-eG#?H-g(Yb|rzA?Y+SuH+a$$q!k2STd!|4sc z+&ERTtJjQIHvn&jb))$lNxKyX9m5h9p|a~(pR-8Z1{-U3f&&=ranTLO!SH}NRR~;i zE-c3p{b-B&sYc-@&G%%hF$_CZ>C(g0Fy824_u9ZihTp0H)$91sy1@a9p3!pVmmSBM z^<&cqx5CJ->wSmN3Y+rlkiY1#ewF1f1vI}Z(XUGM@4`JhmFC49mJ*NE@>yp^e~&2B ztHHmC{Ua5GNm<0Mjg6ua2B_VIgeO+G*bpZnLWD{MUVOt&_j|9p(?z@8QAj1rE5RX_ zh23hbrppA?HG7aTDgu@$qHCWn9Ly(@TD9X{r}zfgz}p;UlAZ#D&>lyuu%i5|DY4sE z5eU?a<%E&5Q`L^~l->@keB(Fq#(~iqv_k>+no*>O_>h_m+3N#6*gk*I z8SvzjmQx*f^w*;@NfE&rZ2iV0LbAlf&b@8VD;C9mc!u;H6B(RsL&%YQWt#JJ z!d?+_Wy}VLyJ)FDkDkJ%XbMKn7e6adRLag9EEUtR3-=&_lRT={aD&%4_I?;SCXYCg z%}j{}HObEMl^~Q^sUB>aHIn7%rYGZ`Hr-a~tD{gr`X7+(aMsGCf9-(X++E#O|Ds3m zi|TvXQ#gsrWkvB&)QCts;pbdkCX*~(GNJJH=- zha+NYe|9ruJ8v)HNElw{N&{ZR-PoBT>D7dJpKAf@VeME(*Zf2&! zHpNyyoa`)gU-U?G?sQjfSQ{@yBasvOezc^@Q5cUmT2vq^hMW|>O7m25KUX(Y%Q40! z@yH@`@9dhp(s+Lt`Ql+~kI0@31fiB{KPvEAO#Pa!?tt6~*QbUFpjf15p3{yZx^e>+ z{a66Sq=@}}l7RyOF1AOEeregAa z%p6kdsI1ZHWp`uY=l1Ew`S->Ho<2Vf0Qf`Atcn6X=IYa;xv4yMaT&JByt3;4q(iiO79wJSf|V~Eq!O;L(zks)rroEQ$XtJEHc?KjrbK1iU&yq=kE|nGkPj%OG0J6CW*yE`Dwl<<+<%1B3H4F3*RIIw8B@GU~}c1UQIY1vT-bOcRk!GBfw zWjIe{f8Fi`Oz5M$xN3f|ktKKerr1{|amf-1BnV*Jb|13B;_e62vcqD$)_TYDFJ-+0 zoV5)$4>4A3w=2!>W5YHTmUICw9iG@=_4b#sek5X34ig`=Sy*u`=xyodD1Ews96);$ir=5xlT^tw{$u4TO=S=<1)!;AC z%Pc;kEcE$G#wRqY+-F6Yq|9Bk2te?lgWX2~ctMq^W~m!B;XY?7@ba;QdUQMk zyQ*m3!gx?i7VKG}|B-6=J2bCx6%0}!uL##P`C;wz#9}IV*hP8PKU~b}bT`JPC-j^Q zD!X0{Z6+KEl}uhjW{+ceeY0V7g;17xTTnqI=T2(3zRo!X=ikpI{w>BC)|3mCUlu%N z!7I532mDkdvZl8g5qX54oiJxm3-kZdZ@NL`Aty|?<{6R?5>ypO!kj0kS3NYw`dy6v z2`OF8yWRShur{HZyx#~t?~XBU*T>h$SC`>DMbf*SL&&6U=R{ ztpFAJy6$jaJIZ+#IvH#pn8}ZiGqyHI3CNHW;A~OTH7x%Y2|4NZU)}c}LTuXM!P9*a zmk(#R15yb0p?ZLUzBb^^|mVnnqfvu zRxaO>jJ>_vRp0gDqZGx7&~|K_QkrV_6?I4Pm)Htd5=xX?;1xRX^wb&j&UW*AQ<~wv znJ{|lKxi$E=<*?)?tNiA0eQI0vXDY#%j=<56dv_$+K5cNxy%RNhRlJx%-d> zy5vCK9o;d#Zboz+qVwXh2Lm4~(X7@|x`#iVqhR6H)%X)*D+61|r5wdq)@cbzuOCs*V>>t#)hsE4-{8f)}Socv+dNs!n$ zd!^8bmb61&QHM|(?x27)bc7<4sEjJ-K}AdtnmSi>+1O-yqUn>IeRaIV`Fd32F8gcB z4JRc9)Vu;@8@7&urKbxf3YyUm#^*u~>9j8Ih_fvdmR%J2Y``Y3zP75!S~WC2K0O=1 zReumUxuuhTH|ro*U9;IrG&5>3?3FsRd4bVi$&ErF z^qMbqLEiHL)eAW-#&Z+_UxOXZ#oCEjK?6$p$K_bUSo&toHEV3Jk*q32V>gM%SV9&Z z$Wmt_jTr6*jB(>Ew^zaZXX4l=S;+k4fnGA zR4{NL(J|U5;#(y?9Z>u|SiS7*xX^dDk7z%EOed=^$VcuGt`t{C^V6=#JzBs(VFMd+ ziGfQ^k5A|8-%su{<@IQxU79x@D?U$C0u}Ukh@+8O{|&q9v@24nhI! z_mhc|nidYxU`0|FIOF_JK(xTgIv<8~y~Y3~FE2Fu`=5DH@JBmU<(5S4+5#sT45|S0 zVMXkI)5GBOlncQXnx17532;k+0mc5*hHdUHY9w%--|S63!ZEZu5#+whNT%ULwrJHY z6YXA2P=A*`yzNjlgP>z!BSAEd{uzBtLzknQ^BA`(tiVJZg!#G7LU4@8I5~|`VdM+U zn_EW4-^B#wOvRnYe`WkT?tXhwgyWair}a!_0!1ATX`vBicZ1UTxycT}hhk;gH(G+t zV=k*}ArgJxtc5p_0vO=dU_eJfdfu&5*?Gj7do8A_Ck}2jeO0vNjey5#m!zI3^Hx`y zGfm>uwr*PXPUqCEnHT7a+bn@#TsW(fG9C(YE)Qz~>5EuIbv;>r9gEd4KMM1{OI8nV zAwV=&ty8ecjx{EN6-27l^_Wus3$JU@y}{b%UK1!g9@otR3O5E1LH%%u(NzDu+}mCF+@=V z)yMAl|Ir<7OEyFYRYrqI%{yql>CRFA=#sR}1{mj1(fbg#;{n$45K*)n-~ z@bjepq4eQz>-H1F`s*h^8Oe3mFlCPfOKgttvEgzmC0nWt=#hU|C9gNG*&}k>d z=I5FRS<7N5gjTWc_bpI(oXvAcO)0Jj=PKHzdj$L) z1KBB<;|>QHz}6=C6=1lGsL&$>8=B(Ag!W_g+~N|D%(a_(v9oAd%AADvBqzPFS~w69n; zwd7U~lXfr&#9Ah12FbZr(rfWlN*$hVJo) zDR18Lh>KGRdcQqg-|$*m@W(rgzVIzbjb{&Cm44cPVM(yVc7FCn?@DH`W{yr;1<4Zt zjA=s3zE3+?DSb=I{}4i{9m6)~g5Ok@T#Y2+=NPI9LqLT{>*D_n|1LIEPg_^@*jYV) zT+q(r-R=e=aNk4G(4-=9BpMPWMc&HcbsDtubYitE*N9dZY6Kse54dQ?{g_srWgoYY z3}?9Xg-caMQ)WT4-$@C8mKLZhHQalSgOPCRbdw+)H%m!*_1FS{aZYxATm3A9^GwMV zxxSGXOL76lRq+fT(gMmr8C65G^f&o;JpRn@CLAF}8gb{BA!C)?(4h{<p=z9lWW&k$G?tJh_Rg03rkw`)a+yNC7MYb5*Y82leOg6(Zi#r_;`R z$a9k7-I3r@8upY7y|QMc%7cYkZTCPL1dmf|)SG7C`sG;REBWpW``S<3|5Wx`O&9rE zMnX^K1=G$&W6FJ)Uzs+W+Bk0PVf&D)tP)w_k4Dt`(e}OwA^WJaO#W6JFd{Mbg1(ydef7_}V{R*-D z=iy_=CLz&U&(S$wh2P6aO^`w)z%Tj8p@1dQ{Boqw^)On2OOq4`uAQ7*Rm7o=AH z>>q9QiNJyrrkpZ7tir!LwS%C^bh9B8BnB+4c0;;DdP?1svW=yl3wfm%i*eYww7;KW zDRX9V)QcLW@4(9HlB+GV@(PX_3GUkO*& zV;xv&ktk@hR-_w(@=x{XpAHzhbIYWyD!ER2YOiywzm@ZB^uLrwIE5~vOuS8f5Z0e+ zr@AQ^2U*H5&f53N!O~|jfkzSO{T!r!X)t>ls2>wu^34ihsr+Ue&wHS!pgNXY!g8AX z3MOa_`^AJTqy&f!@vjc5bXYh#Y?A7Ja=obH8Yz&mV91DZG&Cs zCa0!{C)!97Nt}ggIw*e%y3BGrPZ5lvpboeJHIj5j$8;*4)IXiYR1UWy@*Tv8_*sZv z1SO1N{U0pq7otZPA2Ca z)Fnlpt~#EN9SeGn6UZ7T^ZP_v?d|>Sv@XpS2E`{mTpokF6A6O~BV_H%Nbmm&GN#E%5(TRE0=!!1UY-j*XRF0}5te1iAYlSOIwt zV?P!TurzX(Sw{Hwg8bTqtT6<@0eZ0hBXQKUY)=kE7PTh>jP!K72%ImOKm-0S;F@5Q zZAJd^S|NaQg-5h02UCJs%7$FlBTw2^&b<5Hz-iX}c2Amf5Ig5sHD)NEgay~H*F6fO z!xdP8T^RTqLg!(7m6RNwFb-sTC5ny8{qTz4?vA!rgLzNKI!p(I<+%;tX5@tyI|v{7 z8duHgmG@N8Y*!kANh#W$5tw0b?UrJTTa8Yq^qzhdbh2igQW4N8Io%%Xz8BFw>e;Db z+N&xx5C*wY9v6I&gay?Dp_#soQZy-Vbu56Mk)=#I?S@%9bM@1Jh*o&`g!gqP;f_ub ztu)+zzQx$Ec4n~=NZ6KKtsL&Q;CrSDNSyQ8aCF3cIOrl)RewiEPrC^e`Pk~O>Gz$L z0D6OU)>Z>WLl5^_`@{P2z(f3!#NiDEez9WD-ykA7AYSU*WVz6&oz1$wm@Z^h4}W5> z+T5wg+UXI`mg~|GPJ)yv5MRHG@IZAOzl78$_&tUaM#q#XaPzG10VnR?r^ZNQ@EdpG z2h{nbGZ&Y!l<*oIWF((ur|KB8u7H%!*%B`3Kgn?IJNp(Xr@H#A;$fRS#M!Va=-rZ4 zKOo@yzAq{HOdx`qZ71#_r#hI8uA;!wm7FDSG~_6ps?O7gg)RBIAmdAYb*-MuRbV73 zwRHLl$MmKALj!0bG~PDe)K~O7ZekgC=}+^bq=o6s?>h$&|%JtC{|5nEmSj zO}_znAdlALPO~+^Md7L)t3WyK_=1>^6Fn#R*<^%SVFlpDh3Md`KIb%El9zb@mhM)47XYSA5(N?7h$Zz3cU!zjn6)~g&*@CK{%^npUgQ+Mz<9ZYt8m{3@9obt4TncSC+ zmK)k-`p5T2BKRECfyo3}6Pfe~Yw?~#4^&X)Q+JkoI6KK`^hsiA7q=*Opi9r~GUWmD z36;DBN#AeD59vE>mGwt*Ji5y-vfd&*JLI3?!znHn;`!Jq;^)TaDkCV=(z_?tA%)W2 z!E7VuQ;RzMmG7#?8<)4;gdw={7A+PtwY3e=Ep9N@%bUX2c6vtzK9}t`npGi|EdvpQ zQWAjXozJ7M9M9^}XBflEv@Uto>W@HFmjN}J*im53)&e~>0ew3n=PISSC9~bzdB$V1 z;K<^VR-c3yX;Un22lm8_7BgH~412xu*^5d^2%|79tgcD^u~V5dav%^ktX9%U0X0(H zCAw5zI;q{xj^@`vEHbQ0gS8*5JXMfI2X3uYj(~%55XcyhIlJ6hwslqo+Q!dZ8oL&6 zm-(*wXQ=aCFCuL9K}|RO&%52&*#=w@S0QB zmAN?1sgvUIlmfi?xoV7i=2 z<6evTvbte1yS5g)ngA(EpzuGz3Iq5I*;1i(H~==LWFmmGt2L?GqO@aL&hw*b)DqN{MhzUx7Ehk-eFLU{GB7ef*Opm)M%e*g#s*ga^6H>|1oS9q` zx>g7A^j1||5nx^(Q)sjyGcP&zBQ2D(s~CUt-L#LLp3#en4?8G}su06Z zPsKSHijI~YB?M=v>+>eJ6nCvOhCP7u*Q>H~jA795sEwoP!}p6iN{=`Rxq=~R8q#uu zkQ+O`^|WCK=fug~?(?Xzt+Z>=*xgboz;;NFh$Azrr)3ewkbp_T zUxZ`T#+2^_u6(v!Hah#lRz>xmFip&%%F2s8>IQR3{8W|xwYuMCP69cbNj89Um+O$= zRp8JgD(cO&E?$EI{dy4DDzJ)rGn}E#uDJPA@d1XAxDw8b8D--zM-eLc#@|%ktV+LhxoV;1-yL@#6+(=iJ z*$KSNSLB-##vW1BPR8EO%3gVP&rE9+px;3cuoC~#h_X?+cri$!Sy5E|8Oa(=S0}pd zi4*5ffp|u;07%qjvNEyf2?;fpb{;XMCG)&7^K!58D|sut3U5N`wz0QPx8}h03iD;z z;k4$^E@dj7a#LiQr5+_k8Q(@E=&I)E*t=Ue$qsG2{goP#M%RrE)+IfjHMUC8C$pI$ z=^Pf}l*CXzP3uR-&2V-NFm&0Qti&j(E%w}*Oo43p6ZAXLo;0dAg|fwqlNBcNPgl?n z&D>kOT4)^S?ur7+r&-F*^Im;A>4%IoIPV%3M5@+&V0Tlg@m!)2|3|o$1EN)QDp`|~ zjWgL_-^WUF96R>6NSk?VxRG^9ihyjDLS2K(l^=2A5ew1+9ygQ?K*s2>J zHU_=PErFJGiEc*u(geW|{J-46dj$E8Yxil3U8!=Q7;_Nb*+G_Xs$r3b%ZmeV@?}^5 zv0OK0C%2bF&lAvzUckv#4xhQ$tII43BiFsEe^LdsmR57T3^+Ne%%5KNNb7M9;tkh# z&FVID5JXN37yL~-sgbtbHgfN-3eUjRk_B6Xzh6K@7n!c_X z6_isP^4xrxL{$!hP)s^`_^AdyDScg*HsxeZc|TC9_L=TOy2ohOC9(;~_!y{mIe`0% zkReN~pejTi~%fKj*!toSXUrM~+zS0FP2eKq1mjN4Z_7pGv!ThR34u!xQzD*_TA zy9hvo2e_>fH8R`Qdmh7GHa_PG)04#&UNlA1qdRfgpm0t$01<=!)Jlm$B17wTsp_+y zgVRLiUUBJ4jP&6nPOg4q9-|B#-czf~1$GNKsms;1dfZMYSof>6vpqpMemVusI}@ZV zG|tNHOVI8UUj`8O!)2bl!lk{H-{$G6wt*fgSeG;@PFE~!OrP$PxOC&1x7{oP&P>J{ z86hiuK1KtCPHwDpQQ7p~MJ)pnpO<|sWUXwlATd>Z ziG!VUX=^_;quF}Ha`=5?UcmHHlVDh@O%M*;)*{~|=x1Rcyg!hwFul%WD4_Btp#MT5 z@zh6GD4@K@hF1JoNel8o69J)ZgqtsJIB8vqF<ygXr8 zDTOt=PWrdl18TpxR50@)t^Q6;N0xAW)5Wm|tix%?{m!>jb0OSea8{dgcx)ih$$g1d zE_(#&7K6M1#so-@ShhIN0wdx95T81Ky4m$0Bm>b5zStB9DaezIMo=c^Z})PxFqDZ( z`7!hX@$yONM@qV9KXy$_G=7B%V?;Fd=eqgj>_TK44a4IlMWF+J>AV46)kev{?MZzi zU+IEo=VB2pDR}h=kr2*VgX@toLg#QEm3ua$dd*|b=z0szSz$dPB2Gy-4};tDSo<-; z^91J%>$(r(M*^49n(a~jw5QcT6yqD7>5zjmKifd3f@Yu z4sXUEx=|r%<(XR5AJVTuzzlLsZ62v2Krg){7`@vDV}JHuUu#Qkk>*|m2LyS>C`&L2Zmc-s}Tf;%{O}Ysx#%aruaJz61-86mwRc zoiA83+dUcaAlv*Pa(`WkWW7E!6gs*#XpD=8tZjG63MHidRxd~lTE4D|^6zF1c&Q(q zV#~Z^YpsgkDmWdUWwIY?hmZ8XtcRs|^K#p&qmQqp>OX%roMP^Du;4zkh7SU8C+jPJ zHYthxzNBUI%D#U7Ox|xYwANKIhuNtzXiLU(Pe`}0@bs-V(bjar{@T+2YfJyXA!qvk z7ni|d9Sg4sjocQh-t&*l*&}AFDi0Ox%L(2u*v*O!czktfk2peKc?K#DAQl3sA3$=q(F<(^fzKcWwck z=p`UpANsQBlDbZ8zyaD;{OZvx6Sh7YYxJtO598Tf*zqQidHFhZM0~?D|NUS3k@WQ+ z`5GvX^09y30zj>MFG?cSXw#UMCS7k#$?_MXUNpq;E$cuY>`aWZARJsXpfRsg1#GTk zpVvQ2JigRnx@Lqmqeg+|1G?;)O5p!I=)j30=`&V~5)#OYp`cuhBF7Xazt!x^VBs(5(=53rSkk?ki{>LRW zLxOUk3~tp?fqXjNTvi+?(!9`NU#ppVaQ1CsenA3>o95v9CMUCL7+?!NFGI_paH8}5 z`N~}c3Md(3A6P8X_oWWh@K%rXAmY1^-W*Qk_^1U~Ft^WlV27%6GPz0m9-P+@)c;iQ zn~r&_Ts5vXC5-6@WmEjW_8zEDIS^M~df#ZL!pbVK(=Y5} zhS60W`>NsH%#yETE=p>%mIZ-MpgkZEs%_@Q>R5w&J(W4LR`8^U(HJ~ncqin#XI;Rn z5+U(<7ETwOLQA9ccpi-9mK8`v|y?t^Sm^UDtY}heN@Y*OtcK zpzrx+!0y}9NuVw>4P58(Mn#R1#ckKV@EYxOpU7-28lBOfPT3>|U8TT8YioP6g9+;w z!{PJ@Efsu)3PEO$&-$KomLR|u;xfx!f9&j}%zxQH%RMHC;l_om=SxOn)Ttf~z({OG z;&m|BgQjosZ$AX|!CzoNHX)oJ2#WdMH6Ano{=(FF%vO*b*rDSR)5waRg+!l;k2{3E zAdzjd)t{Jf!S(?y`XIbQ$?OfdIDOWo3iDlFaF92LSIWxFP`+5oG9H3Gzs~NQc#783 z%jsp;v5@XTy%4X%bLI3l$F46?-ZI~#x?>F#j*{XCx(j~RxRaOCr}4F$t0pPH#ngdE z>R=B#aCWV1KmzzE6uP%V-49V=uZ4M@+vF47hYQxDBR@|svX{1sAOQ1bs zmHSu4ZXSH2}asd#+|?@e61OkJwPm)3;F_nIB{# zTcSKDo^_DFic9YEiu>imuXoCIu)x_Y5PZ5(@r~(N3n88&em%i1Aaccgx{Cn$A{VC|z3jII}?qTL4zM2xZjQhz~4Y zwzm3rb*`I=Uv7Is*;nqB*Rp@q{s7&^Yy$^y(y)J80s2!m5;*j+x@*p;2h+{)i)#y5 z3BIcPsuT|R57RN5-9A=Hj<593h#Fw$RSgsxK?z#j8<@FcrZ0iaAL`F_YDV0sF-f)- zzfOeLpb5+XpCP@Q8D!`%VR|5E+C4c+x_9Xo&gb%W5FwD`(=Du&VigutZ5|i5kugWhi3L%Aw-m_FT&{BtmICCwl=DkS(oD zoW$MNd2R|^?f$lmK&j9Y1^1EK4BSB%&!>L07@ESov0lFRMvj1CC^TFlY0(4 zHVPE-Qv>U7>Ht|FPyK|)Kn)gl(@VDmy|ms7 zkd;SZhbqKELRTV4+bGlkX3ld+7K1~7!y7E*x!TnJ{2e+)UC4NI-xvS;Z$4+8DKryc zA`QOuced1@exUy$zpFE~_ua^^K zpPusm$zy&H5Lll)y#=WT-m+V zPW7Xu?E5086sTmfnSI;=|H)%=CUAT0sB)q0|MBA?|AGHolYVm7Q7HZEk0rF2DC&7=2ZS@w8+#LC1sq7oNcI74Kb-&*Ris2f6R_IbTEd8<8Dp|;AVF49+;o# zE$^VJ=3-b%QN3if_o4KIA0G~Wo6F^VEK~j>T#)n}*9TmFerA@Y4sY}nNVfPGZGIO; z`?2~re|mbSSgR#>5(aNwGd6OR2meJN4f|bbK8B54A7g;|ratTuuEX&s2BG=+>D}KC zF$%DeZtMP;A$Hm7ZT)^?7=}KfKxRS1jS(W{^csUD&Ry}XFBL}lrz3vuh=6bX)Yz0i zg?j0alnN@R_t4kB+sKVj)p<|@zrXbT_$;6G&#;uMEt~7Nva*aTQKl=S@rG9LG1H1Y ztBI8vZ|IGThT)7PqmvJBN72;XAULwU)>kG-?@L=NN1*i!)Z5(oAPG%4gb?NDwJUW0 zmGBeG=~?3oOr#8$NY=}VZ2Ly!Q%3`TPZQlWZ(}q2#`k2sKt;2qz;|u{h*6)-AV(gb z!_3W;1FyU(DMVu+8>P8FHOTM?fIg@W1S}{qcYSY<+ysWD|IDxzdot8RpwHqR`bljj ze7?PuS-d%XF|`V}_(UP~rjGgAseI!sz4l@zc1^&SQ%^{>LFB_f@f(LeNqdfSmFj9~ z?PN;6C+-{EoZ6%qNDPeUmZ8u6t2P`5`pJ}0$H7@EXWurDu#cH;mPN%$N`zN@kpLVU z0uT+6hp%!2e!AO5@(`eAWGav@qjF9_Et zblTEEF87ikXgOuV@ZhYhrl=)3fbgG{5|(zTnONd%y6Jtqb2u*3$NU5wZCtZu;X8dC!l{)ckvi zHGkRn#p=&_p#4K{>7QHFg1du>yt}@MvTg90CRy9p(sHc2zfBSF{>xL+f5&Az&cKZ? zfAfCedgQ$C2S#}BeHF0*JzuQ$689(c4jiHPCi1fPadsKSmDv+%S6?ppHURv6@ihPz z+S=^@{?!5v0EZfE#Rs~5U-Vasq;cQNuZ=~guiYLIG)AC_`6oW$tP-z|NIo&-bME84 zf%mn(m0Xqx>s%kK-wQAVL$}uB@wa|>vjXGI+#4o`(1_^7owdlE2ZKaeb@@;uYwMfZ z{7=lH%mvc#C*<$#yPYt>+r54!H9dei+WY4pt-^nz1A;F6^S!3P};i{AUJbv=sMLXT)11wBcly>lhXAg%1&q_YG$@`J~_7~WbB;Ug~zyu zG&7fn_Qzliv&LcR2OQNg$wtnc9)v|{A14vvSd}v|9&7%+&jTXb+?C6N>Zcd}#)Gj@ zOY=StpsSw`$Jr;7$_(nV%J`N3Q8i9+q&^a4T3Of;2>yUDj4@r4SWKglAj9*88Chsq z_B(avwkgPiuiL0<^s#j*S5yGHoP1#Y((}dt#;GTip-w@w$9Ad%kKzk7*G4zTqtcUN zh3o&Hg5+72N~MG+Il-PO%~XpfojMD9FpeaPFd-0fjsg%{BZ6(ZR(F&D(;7y9?;{*H zK<5^^+ynUudI|92%z5Mo6{1G7=ryS>2p5ut=vGqMAWm>sk7)$9xxM)2UcC(vN-Cq_8lMt^CF?Hu1)bzs@5`@?~(DK z@z_{J`kHFtiVuYCx?j99vNbw>X##k{ z!*a!kNn7o72e)D4*sN^v?R<`#QmJX@PGV5T(xhlAbmf!!81RZ$y^naMZ#4zl1+N$c z)J`|QkpO#yde&80NopXWblnS{U|gQoldYQ=#hW{lj^dYO#902CrJs*mx=4zLEcIQf zluBrs+1l}q_=l@gkxQBi@A`x_MvVv6G5|A2))Oq<6tczAa1HI7Zs|eePKj16u%&+^ zta-FyrXrfXa)nJ>mE%nmfY>YEm{QG@!__C4E7Mozk+DaAZmYYGrPftCH^i|FkI#A- z)+mYc|?JB!JuE8o?Y&*OT`TH7sf|Z@Fbf7ntXqd7j(zcu>-|Ud zSk8vxvaZ(i&^8lBXr3-MD;NAMe9FFJc>-!-fN}z2neu7iX@El@yDp@>zrGNZSbGDD zLO(wu%suWYN1uMbe=C(kGvyO;r?k237axbjf`{?T1ky3nWI_^Y*8JV?12JDP{yhH_ zpa1w7dpRD@Jxc=tk*|&hSuItY%leUFn&r+=8Lai^*CF4GU)-GEE$^Q)Vby5K>U9wb zwQzsb9{QqilwesQs6EtpQ@n-092Qj#pfwNQ{Ncqu6<;4Umf1RaUb)G{Xg=4jG`dn@ z2JqTo&O=soyjJ~yXn~n0R@>uo^Vw7%IX~Y!Mze6NhPj2uH~}Y#L55BF@S}j6av4e@ zA=6D&>D@~F8s3-_a*QwuDwV(qAOv)AzB(!$$ONqHua{ZGgmi4f(Y&>-7ADXSx2VS@VO`g)_j1TN zC}67j`gVD}ZeDpUDwCg>^FaMM3%a=CCzoli^F$uYPn2mBnZ2x8I4KVMJUfZxWLY^v zilSW1`KD}9UBcS%8qp62xYGrX}<4TYS)iK$4JHD&XR#x8hFA_p)F7o_!UhzVV|d z1V|&NX?u6*DdHF3L^s4~zX^Px(#Lbc3f6>pjjXk3zW*2& zNE5FXo3CC&D_5fMo%Q^ROwH_-dLPM3|8vwiZ$KW=c=4#*xUB1`qsjM#jOpKNkeGXp z)NhV!Z^L<8sLr?m&wJDqZrQM^(ma1e&MjE%E(NTV;{G!I{kpkh7L|)%7HpKpoCn+% zc?dm@mGGELy^%*@dC}Q)#!;B=HMMQ=NNzkjs$tvY50OKPqQi7Eik+nOl8i#eSPLXf z`V=cZ)7=MXPnBhk0`J;^tHov=6=CuykQl`kAc{f?wycaL-`4b$<@f$bAI5e99j^FT z%5o7PT+pK{ume09VGV3(WaO!@2t?Wh@IC^pm1|B|^H3)w1J=&B`*i=-ZvqoIGQ26e z)oy;~7-S?u6<%if%wkF!tI!tvV7D{9u_6myNeZW+MoDmyWtvjUQ7&+OfL0%Bya-A< zN-;iLZsy+wLZtINplT6=Lgy?*Wx|$``a!Vywsu~%`YgW|D8J=#1J^Kmq;oKZtK#~Y zUl`cY?6X=bEJ$Ts{AOMGPOQ&`CoKlyp`Nu#Es2~bs}ls=DeQ5QL6|+CJ1Zj+nEw5GmKmZ1ERWm$dvu;ZS^U_nz==e9bu_uvjG`w zh5oK_B-hi(7GuGrRTHaRz*3)DznR115&#@ydwRspi8qXj3|oC3rNjjvKk97^=(haz zLLq~k1zWiYqxm1j15Rj2defiuB91tVX6w+Sn+#PPV!5(KW zT?2TfJ`tO%%QVFnGOQas^hq1x?s|j^Y*;*IzD@gdaorbFyXX3YAlFNUk22BHZWD~1 z+s<429FNBy@2{ibXJ*6awNL0SPiIH%zEuK5+@WLVD7yCgQSH1^$=SxjeFN;$m`25g zS(12%Gz)=b=%jCnWyxMbGvuf93$Syqn4A1EU;`bd&o-w&Aa&xORS*wF&T|w|rnL$D zJ42YuMg%@*r4A?#UwXi2CiJ~;Iz1)cd-fjA;%w?-9;!a;mmhlMw_cNFp}r< z0Jk)X-|0z{=x@VVt1F1Lg#m*)#)zs~m3=oT?j%k@0J5(a=hgf5_vIlvJXQ~7JV=j;LZ-rBto1vBNK+M6okaY*@IiAf}> z224kby((YyPcGjNOe2{I^2OgKXPe(^z5@GH;_a#s%P2npJD_dPa*sI&2W-%r^=q)gHql+IAV%tW*GbHj3(x{k=a z<}?&F$X;94$hm7P38ej$BS$e=Xv6190qHSx?Yi*)Vej4JlD_xH@j9MUJD-)Fowk{I zVXbY|S~4p&FTi%(vQ8_vV`XJZWoBuLii(Ortu42u(w&wU)@->lAvHqrdBgXGcH8-!v-A0#-{+jq&N=Z%j|zD6dOh#=r!1wlghhePHpc+v;)e81 zA}?#7SBluf9X}}HdIDjbI6~}B=46c-K7hD%HmISD;vto_c~MNLQG+84{1lch)!6J$ z%8x+g2z~sTMB(oy{0Ic&Ml4Z=a`t}({c7~V4Ak^?kH^W4HxX*M95r>hx0y5!L}QOlLln|XK(u7a z&HEyU82%G+rpUim(7yqi8i9+yYt46*YlX+|)Sb|)Q& z-i?^tFyX%m=-Kbo+ zVlyrGfz0PnVN4RS*TGwo4B?wUL%TSXhA~A zzHvrrmjD(E;!)WY3!jpu`wmH3j!Kwf5bEL-Yg#k*@k_n;4N5>z+g`$T?#bS^u-#dt zuZ4h>E+q7O(9gj46t+M3ucOwkQ$>LQJRKHTPwS$&mUhJWF8Vd&J_Va>EbMH+>S__2 zop2zqB?S?Hh#4D8a)VrOyf+)61vGEv98bzjwzMv-f~kF)XWg=y$&b!E;_J8*ESKmfq0~+ z-wxE(lkn)djwWVDeIFFJ(*ET|1-toWg4Byw7sF9Q{V{?)~Ma$ZPOsg#)nhYq|SA!swASlg6gr6yAzD)hvyC+r*KE+ z8*uax%S(PMtk=b+xr&8L3vBnTR^QtP3AV$95u2gfsnn4Y_&ZjWjB`vfJh?{EaJs`i z89{SThLKj&x8(*NW3x?d8&xXam!7yF+b_R=1K3DEmUp)xNeQULL+j){3+t}o2O~#Z zS-zxUjFli**9?4PJgLHrHf3rzh#WATnd9|!Bx@3BAQX%eK?>qlf90vDmIMh50}AK) z@D>dt&%0NVDM{T5jHkN|gydW&OMHs8hjJua!_x{F)j2$gCGiE4 zpght%e;)Z$0~EwipMV(S0|pNmbj}p6fgc4~gy)YCLy4cc(e;JytkJW{FH8Ls{C@D{ zcO_kDo1GT-0mhtCN~;sFI=$#!bR@5Xb>7H6epILmuJA-;hz`lUkj6@nhUwp79G zHdwk!%18o^DtDBWk(9x19U^{PYInwAPW&_vl-?X)TQv}qlva56*t~0)iHCdWKX{yt zQtjW4+V`3?r$XlcV2&y&;x5IBR)zVTn`W7;ZlJOPwjeh$wI-#2YCBzMuw6+|Ecc(1 zy3^CgqZAGKA$xJ?lc-~gp=uCyqolwT(Gmk8tHlKzE;OAB5 zGg-kJMT2bB9MbPIyc|Oqp?-%E{+ z!AXV3cHIQVZDxc_f03j%kkw;&I=xSgV`cKak?Q&HlB1hGx(PB{`mfvE#54fTD7*uFj012sY>M-Z;U3< z*rqkceYY*gR)Ex%U6>u`k6asH%QwDk2n|$U81P!b?{XIKE48DGeu$xud+?PO>XLQn z63>JVWkbH=#ICL$5|5P6Rvm8;sMC}eDPkwNJX~_DbOLqX9{AjjiNV5^A(w)tZIuUK z(HnbG-#-3HN<0TWxHejOgs81DZqbaNzAbVvg4|RFS6QCr_c{`}1Py1&ISB|`YU2oT zL^I%j1IHisxp8c4Xe3MSPnWjo_5_p!^u?n-%(k&*Lc%%~Ah}V2MWoZ9;ZbRX4WA?C z=ZPp&!ITt|SPFNSY(rvfA1nNKrGOwiKix^Blc+1eelRt&SN(}>!EK?E%X9A-CXZzB zdc$nWwR)mWqkd?h%u8d68u!R`VoG*|G|A96jQQQNJRZ7L*^&{IgjL}SQ|@nh>>q)R zGsVdxMY;LVx|aNMyl@s5%-4(tBrzL0|1d>*7(ToA8an0I9wjdRU#ZzBesvwltEvoK zZJGD5PuhI3Z-Zqv4c8AOmsgV#VXU9qu9cMR??$JHCHAI)cOLCGAvWp2lc8)nrZ1dfG+CA+6h^?if)IgcmfsR7NE7AOe z{!^ji5Dh2pkHKS_wa(ZTnEQ45s-2_fx$2r-jxFI!G|Gl>=@NHCBUdg2v-7-?rRct` zMqupr$lK7j;Cx$8O#9-@Fc6)ojcuB0jpnAy_GcE}^|Wu;-3gY)N&|pDsmlxbRIoYB zwTm_%6r!Zlkn8K=&se&b-Q`ku=Ou<J09f^ zxyuw4UPn!r?+Y&`6U~l@%pE;o`hj?7R6>*zoq$nA7|MaziOmL74B|oq%jjbA`ahF3 zdnmiq=AiM$ht5$)^@wPL3l=+1ti^m}fM=)UxpOV|DUg$t%_24?PdsE${eqf+^! z7xXn$C!SSCe{pBz(0jW_-u=cN8v&7E8a6W)l{g(h0x`NZ`@|mRMriu7U7Iu;<}IdvpC+hw*Br!NZRbnKpBLNhQ<3i~9-D`acj&C69K z=@Regk}u2kUB9dI{tPi$P`6gCoIFA#7b4r1@Cqg|j?3u+&~rRZ0v)N8U7xGJWE7b! zT7_Ief%;=Qyq+Ndw84@)<$pG!w;r~{MbHx?9cwBzX`#}?0Rha`dXBu-2^G0xS0ui+ z0_<0$6l$TNGjSx4;{8io&`DjP2D)Knn7HirnbR44Mvny6#dAnoJ6gM z;0Mw3#gMc(kLctPe@yFeSK^e`NrCbp35EWM5@OuVWFDEs?;|)0Bpd#4|tDV?50u}GV(sjEVr0y|G42&cq$TiHR zXbIa0QWC-c5N^iTC6b56y)wo_5gP=heRk7VfjXo|53T~$FbvU;hTY1`poxRR6Y98A z12>(naIj94L*}bIDdJBy-AYBR+LIAXHgbgW5)@tm!ypo2P?QE^ zOwHyj+Z~u!YYwq>*w(mL^Ar@@QiUvQ>VAkA-HN*bT1r98IZx-|L&TD zN_&l_vwJzH6u_`Gjt<8}VI&aT8`L+&FT`WI7U5m_^Tg~nVSPl{l{Z1n+cRNk5WqVL zI)`YeZzL80Z7F4f5s^KfHcrfsqu#PQ7-SK)iWYKKiq7s30Bkr~1^K2R^*&x&(mLG}UQ zXXUR1>Gh`lfEufdvdM2}6og23^GF=-txPa1Can;;&MJ~;^ssb4+SBk}q|wi%+esjr zw~KBd8TweO6KwYp@O|ALp7uUJ42d!1k7n$%Tm0pchRv8n9<1faP(L<~GNfRB72WVf z6jOFWQPfH1NmK4A!hNQ)Wa&dPj^J6mfyh#w%PRy>cO{l=apXna6KA1ZH}fhy-o@t7 z1Xh#9*cja?qzvkl@*A4wRk9dCtFDr50e4$?W>9e?%0~dItAhi(-Fz9LAaZ4*zIthS zc<)c0K+smP8>A$5SZABhL{latyRz?Ie@%6|?8t}GcvbpGJ~Ue397xRPbFIigky?9`pUI&en$_Ax$^gy0l$!>J@rqVeUSDUT3~1D297E zNY-2L;~J`7ohX%Co9)U|&xuo-t7NH3%+w3|Ri7kIvtdLiFu%BPA-@LH$l(l02&9QD2q z+B`*8k`#xfwQ$R_)2>kn;~lv%w#H!#Schpe;{}#&nY|2qPGO;X4}0A(#1)KXNxL+< zbf*V8k5p~ZGuT^%f`%%n`-=?gm6Q>FMg(z+aQe#=VHBBDWD6okWt`h0*$=0?n~&6V43 z{lQRQ2TdvEThpMd3+&;p--D>$Gxk$UJ<9q*zGXI7>(p@+6U|g)<%@i?)?Vl4)dhXl z_3^hH$2)L^%i0^baACaX92aGSk6{l#+U}8=%(VG1h}_~pRyNP;)j0G97}QFn`=nXU z2@lP0Z@HftFZSrnvwe-xsIj0}qLp$sl6EcmTDT*g1(qLt*19Ml9f%pS*JOOJyE&nW zqfAO1$`T|rsC3eT%d3`ow1dcEl{})OI|PSe(>?FzbtFhZcuB8ijE`e7jTbs2&dMJS zCnsRqdbHmtGH(mjwWQkN>!oWGdFdWfMk<2PM~Gn&t$+?Lgn(r}pVVb=xgZ^1=-43w zTJ)fyglxTI533txAtk~$OWk5<^r=dxZm^$bPM zs}b2aev)aqe*B`jTBejBG&&}aHZQ=yOhZWQ0U@$}NjD~zs z6-k;yp6AcyawD@jQp|+;T$P$Vp4Ekw2GTv-;^>M?U|q^H(IwNJex-TceP+tM^8vwP zP%V;E9JLPv0s@U|>)wHGn@Z7%)C!TvwA`}bY4suw19pRXvo6dgn%q{hugdg4skYJ{ zA(o9hU1_j=>>3YWv~i3duozk;SX}L1Qu&b5-RI#m_#Hiu%TN8jk2Zu5is~L(?~dxL zsqD?HzG?-+rMi>}yes~q@cDv7iez~ ze!K?~wBG;%82|(_u%HXl4aw$#9l4iVZIkb}yOPmGHZUJX zl~i1l6*8r}vedd8-bEVx+Bs~dF5qJ%Nco29`PTcgQi=&g=4qM-F}xGtTtmNO_jMm$~lG=L2+OiHM-<~47- znI+jiE)>!e`*J+!lnGkb(W$Z{<|CwsC8`Lz!5K#;>(1soy-AZ|{df1t7ThRVSRFjH zJ0p}Izc8yNe26{=eRC#RTuzrrZji#YvVBTuxoQ(XQ*t(99uH?@Us=WBF1${_Fanks zw2D_9G^PHDxL#5oz0b*+dPff@zrtN=29;4oyWm@uF%DB$;NmCLU8+2fvsv$HGxC#fD%@VFT9?f!?Vm7r7}6uPqWj!3QWZO6k3O655Jj`94$3PzH+E z-#mENt}pTL=!aZ+HJPKsJw}bmCZm@XSq#?o{@W0pfGeD3dRpYJx?~ylJ6c&r>b3ik zLTv&a2*pc5pxR8U*t?cepfR7YS6N+>nz}=0!kby}Pzai3zCh4XP7$%KAETR;z6s)8 zB;!fJCGZ&i5hor|R~x{ds|x!r$kvy1Aj!IMQT4|5Gf%XSy_B(p>2edf=cj=e(1LZP z6GY&msErq9n}HpdfciAcUSy)1^5ys=7)~RrDFae$-9$c*i)QMoVNm559ZR+sp6EEo zLvXf+67t*bm+0RPpB@kj8d3I3j17b;*ccaUx4i`EKGna&X*PvSr zU!hZybw~_Je`TVz8ZM@x4FmA&#hLSZrarf+L(2GLJzt;{R|0sky3Z*_edk6bClS5O$_Yu}?VY&;)R0eK zOC&AE3?qkS%b#}vK?DKp%riD(qzm$c&g`Rk5DC4U0d8$MG z)~sSP|~IfqzhHxDJB7r#z8=slax+>an)Go5|!(wHKG>`(nj8EAm64 zK#7n=(%B(3E)5HTv#}(v13cK~i-nG=P3kba!<4@VYR&hx7ki#AWs0+w`B7SHX85+X z8BSwnP4YsrNBJWyR7;KS1h>XbrZ2ru!&)A8x<=}}OL_1uWk?JLGMlPVewH(KY#u^b znopN5MT6Tlx`GNa$%Cv#kQ1CQU~)}#(th0-owRrL0i4w~97j=LQI%$}Fibj6lphjL z8LPx@hwY{~GN{Awh+u64V-Pt5>gW-0$>@X-M_#PE3;^ZjzX%ktv5#_a%QKw{_ImAU z(2SLLn>)lfa%|j)By2S(WgK1r9FD0g%CIVMTXPWsl;u5eVPOkzW{+p!jHVWlCbQp0 zdLaaFyC>&f_fAoly45c-wuYZc>bs(>wc z3lJh6_qP#tFsj^Md|9Kp)rsIvje;Bvd~2p;^%Jt@JLd$7Qmgm`q9tS<&<(kw%i*g8 zP;-&;lfPW(>`#DBJ!``O^|TdqKq ziCf6W+>1+Bz1k5t=Bk|Es@=SC6x39oGPB>dsn&uF{&?!QZ?u+=$DFsasw#x+zBGSG55{sij8KD%UP+~oxT{4ORIF57^A2Xc7}R0tjP z_-m#65oS;>&LDdIaH{DHiq>?duq5SdOOgCkUbw!_S6(4{&0dFXPvC4_`QKXe?9%ve z7Vd*m>8r2)d}9H)smsjFmOs1W^e@l+{y*>|y+r$zo0(U==C2M$v43Fo@BiCq8Ta^p zYx_oIgvrBN&lg5#M>L*GBQi2QoMr%bkY`EQ)V}qOV8w>8H!;jfF|vI!Ut!4D#r)Gu z8xJGic~1XH8Y0Ab_#$qPT7vUO7XNBc=i0}aP-Scc6c z4`C@FEjD))nR_)(^qX1lKAD>0+^YLk>Abqmqds>XB}StxJtsLs7G5NZ|&S%zA6|>Y)7W^hq*Q z&Ie7cIw+74_NZ}Gc=N?syZ`HPeJ=8X;&?YHyjNK>mJvAfgiG)w+j|-n(B z(Nx9Ona-HbD&?7q;Dd2^Zy~S`f*Tve znjqnPO(q@sS-2Ztzv)s=(FwWxBj)wW==r^TWWG#U)AlnkmqAvw&Du$~c2LZ3kmLk% zOy<|wYkrQ*^N@Szi)p8S=B(TjIyqBUCN-Chz6YOBaUoSFAFVH+TIF=`=LpXYd)wL@ z#H;eS>FaHyfNZRMA&2127vT$kMl$FXN9KC04<5^&>cGGq3N1H7JKQ$p-u^e`MQIi> zL1GyhQ(J48;eB9w|2B%jkO%FLzIsk?c_e~8S4@kM+HrcAFV1>*j4A1{poZpdGaxc7 zZyxN)AlYS;UQOi6iR~B7=svsvRqBk*@~SHc`dcDTIbBSY**2X2wghH5Ni#49|9lT+%faW-|@Jo14|& zUQ+b@NDtd&u;muO=?xmgE>t{ZGC`cX)x%>eiw-p~i2r z5(8C^9w2>$(Ja7}qnY_jYjI6kbnO0V!B(rtx3WL^3yR{=X`3WPle|T$%q5-k`sa%c zaU-((1d+%gowu;Zvxsj^p8@ubf@8LXGUCV%ay7r5LKr0MYfqUEXLP>oUlJYCP@lG3W_t->0G#m&@0F(FIrj#DGg=o}_M8FpoI`LQDg zQ?&E6G6EwyO8=57%B?{SAqbvY%4HUq!DJOl49ASM!&JfyWwyi_)m?4mm~GH3s!rX( zFxpn_#gc>H+9b470dRINA2KSy_pY@n{zxg=8Z0#VO_ozhhf)oFgc1im*Q(=Lg`*iB zl^3OQTEx$)W}hkjnV?a>9DAN2yH9VVuVH)gK3;SRBbiYSE1Bgy#kgBF_VnWK0scC? zr{r5f7U|M*SF0K9s%TNH)TQ>(mteH3F{d576U%QTff--!~%b*^-6SI{JX+m>bVBX!}0vp09&N z%WTZxBYW9ojl`O1!Dsj>6=(X|mVq_Kyb**pP$JKqnVWDhtAWDWW`jfYY!+9#=WGdP zkPr+iO7tf87$qS&2!M6;h8^o`_V-J4tB1B=;@()v1H^gErc53YTs6wQFf>m^Oiw=) zP34udumqJGc@V;>JKT-tYJK%QI6OtFsa2I$jMvVuQ)f%Us`9EDs;}BRz)Fd#nx*a) zF|f0(ky4&H{B=yb);}$XCqS~N%?$WUoLRl@zv)-=>uJ(slA?5cwHmQ@V19yWm=U4O zO-i!_Serr!)^Fb+uHNAz#5|Zs3Is!;d~rG9wvPQ#>XKd!-;Jf99yK`g-aBC1`we_N zyNnq|U+T=tXhx`OJ#nON4}t8W5YG^7m|@e>cEF~oHfxDu!VVk$a*DizVP+TW)!()` zwX~Hihe&@?uF(Y4Eaojaozi>E%8B&{wViaj_bEn50~YI^(T|?Q#nRx)L*sD!uI%xc z#BHWpy!r@n$f__CH6tCb2rIQZO*8*HdsSBymDXp#o7if!;N*8YHV!QAM2qcK$cn>3v@#a3iqq6t09wXBc!EBmYgJy9Xa>dlfa6PBL_w19xV7 zN9d)b7DXkRB*5?c5*FCBHqe9DBAGnLx<(~xPpR^~0Nd~QdA1+a=a@eKplf*k{-NCN z;Z1urZ(UcXkj#)3IV)k%6Zh8y2+MrU|@G2azsoV z&t_nLNQIM^aMAnwxxjAb6!qX$1Cx5l`pCfEF$12GgW7;^^lCREIXiVkotH*7RPoiS zCd+2V6@9>}4JGj-g3`;zp8H!(D6whv&=-LJBACZ`+(lMa3zxn%0z>fJ>5 zERu-zU4#BI4(`H5px~*F(SsqKXaJ^9{uY?r{1XwAb5;|JC4^drqLWgq^*y&bD`@SM zDK+N^gf?^xw~`gKS;}L9!}o`4Qww5*NRL`>WS8#6Z+ZdKwGpIpO`~aux;5}zkQzB7 zREOr<`g(iRaTlcgluj#ZlT>}((bjjrTKZx9X5Rq=Ng4Zu-M&&Q8ICU1YHj7Zc3rGd zQ7W4+=36(#e?^auBImJI1mEk4SDK;W;Ry+ZgA~zGk<@eFl>|)alBPw|)Q_^%zMG4g zz+UM*Xj6#{ZaZRa!%|B=sPvkucW}B?;uoErMW||ziJj{^48`1n&h@OO<+rFp!2tS{NC}@fKlW@|Gd>{pb)`ls6@#tg2vB?PFF20Pe4pH=lxlS;01yzj1= zd+PFJYn*b^E@=M5iH-=)5ixf&pWKoD^?Y*R9IhteE8A}?^+@NuR7|{N3pIWG?q>7G z3wfY9tG-U{6U~bL3Y#+H$w%<*_LI%vtvu$Ko~L6Mm-CQ|pnw{X*g9Bi*AHK(UwrQosGt@E*p3F0BfqORk{ka;}uzyDe4a0E@(8O}G(N)}*X4s7 z-pO0mvrF;bei8kCY55IlskFLJK0cX)jl1;LS0od@I9gG|qAq+a2cZ`uf|8)L^NrX_6av z*Sg+YPadn4dXn!XYm7R~aHC0YnJiW~|7Iw9O%-Lsk2+55Rk(d`^Ux4$Ip&(eayJh? z?l@yHOdIw(8~1YGkAQ6zgy3+w?*yR$7Vd$JLB~+1Hh0)fR6C&?Ru3(FEX%Ljlof}@ z1y?J^V+MfAJ0?LYcn8C*mnFO8eIk4smVpaVaK8}ZdiD&#KcWSfxzpeo)@cs&zf&Z| z+E!+cXu7b9^v&@RtgbzqqOfdQuE~(r(JgNt_P?R(;EHy#+wh>wDe~vVxn6$;_kEm_ zbJ3p?^tC(dih|}ols}b5(b4G1@hX>o{N~{a3Z*w<7g|ii?JgN?hM3=J%r; zuh;ZpVL5D&p63;+NVQtXvYkoIwgMR^y+(!Ayr81u2r$|A5QsCty<7$6{D{$9usV_X z^B#zjNE~Pl=eWFG3cvJ*oxmHd?MDUg!pwz*~i+Yi-Ug+iXjNdg+U_UyOYNhFx8b5p#;!1P1 zva768;SB}kzOBcLLb#z;uZ74a(KMmr zW1pSzx6!GGKnQbUVRHVBP3AL4p!dV6-EqVOoFG&n<(o`OrvslHi;uuW#V-(6Rl+g*}p zj|qDOC7iywfew`H0mVzic!5%xF=m3+Vz7r!P6MNTPsqc#IGbKT(VD)2-<8%yWP;M$ z|DC61ORM0^IGd6>#yma6(f*xJeH1umvI(q?Z3zq6f_=; z_52yac$7{Ut<8$x)E;_=zhZ_HJe)^OEFB#9KOn7t(I;FX_#_H0K0AO8^hI6^>N!yL z67-^?1iEB-V( z`e`cY`ub_H5)Guvp;Mwu@$Ds`vh?wHU%fNUW{23b4sUuSalm@xnOFVm(}z0)&USsn zBMzMV_|5HaOpBKaAYFX!JUaK|_hud6SKPU7JQQRg>fd@KdE6hrx%=d_?6?a=NB0}7 z4WdgS_QH)vuXj%6ZgVXU=>hqZ{6}Kt$vqE$SaCmgiGKO>OFqZs-$kxW3WP-dlIV^E zizrE-{O@y#*{rrSe)yb;o=b}7lH#vP3KC2}KUbLOf3j7e(@Cup-~L-z8(2u`^o!Ca zz>fU)H`Pc=md*0-K|sLO|0i?bbDJClE&c%pAQmda@czS{FFOp_|KTwByEz(e$H6_% z4ff}*{XbbD=r;09^yfy*^LW#9&ig;$yt?DRr06LYZdFJ8TR0GkQl93Q1>3*dF!+z~ z>Hd{2iG_33k^hTa(qB?iKWo-Tj}0HZzr~&dd7d5lPe}oFf${Wg=YO)=`9FvNU`@LJ zRgQVgCEQ5`CG#JUJb9jCe6FoP;mN;6jQXFCN!?i-Jo?uo8Rokz>)`Y7?f;?y@mL)G zVW^>fm> zi^ekr{|7h%zc7?=r&=+!{}!U4i$+#bJ^ulD&0iSCevXO$52{8@B{m;GL=U(q~3;C}WyOTApJj%aJI2RsZTCIOQ%=J8m z{M@4WhgcN4Ml1~f1Ih-voGCiPFG^?rDw(dh@$?w8bdGRALqK507S*+K-y@Hv4x^`)NJvVoV<# z+fam1))Z%#l3x15(=Odhp*^3^dfKo$ifUQ9>Z3`^0f9Sem-6`Uo__ERuu|;TPupHM zs&}AI?l~n7CaOjr#$rEv)Z=Xj#ORi^#ZQ}OBQgb(U(P!ni0Q=#JB2~7fA$QlN-AEQ z{j>$Qop>%}-}yn){i1-(>R#u?&wLPUvwGoaBQH%-`F{z@2qVy#bC6Lo@2mZqz|x5zB3G&l3SO8O-oFovxC9nfykP=(}L((JVQ#l7kQKHXV4TO ze)h2{Fc~+@Hq}96_GXZcM+ul^WZKaob(TRLX=w;SlT5wb(GCjCHz$u3W(MK{r=nu} z$>KL<>XNaG(xwo!xnFC0x8KiEOs%6(%%dS#O9K|7=C)n=Ga`zp1emNwJ|5L@uWivj zXtO3Jrr(+lzy*d*u?=o>RdNniYMfeXn;c+DG|+Ylg<=Vzgi)*)iC`b&&pdHVGDlUG zBSFL-PDeNx^zL8qv_kL@J_f=k7&oir-l!rfSV5OGN2QkFU8|+;EEZKOHQk~{TF2Qo zr%yf1Qd(#oSStEwY{#(EzL@r?>zus5WKNGu4aSf(#RlUhG_}JEzTU`}0!-gO4lrGb zwcQFvqD|wK&Im9Dy~3Ad9FWmrDOeZs@v(lUZgNOfJ7}m=oMLHakUs%QtTil>Q6r#4 zkcg2t_ly_W+2tdW4U4q~qnAo3j@c9HNz4nY5@}Cq-M(nG`^`tIo4UcA_K(oGX~qk`a;M#=Te002`$iC0hrvk(RA4 zn-HX$08Eh$`j}Y9B-J!HBJ#hdbQQ9cVs(F3$D0lYwWU8;rq0Ls3Q7sO?mpO*-y4OW zQtLnE%NKiSQvl_%Wa_9o^ndZ(FHj~bZHCrc#yfOM{4(qCT38=&39FZHmNeGGo#}7` z6>Du4^l>5)5*Main6R)4an~;0^3KZDZ%R+XDoD9Wn8i7y4$yQV7N|ybekFec*M~tL8;y>k1rIvHy3G*frC*+4ATe0 zV@DuCEfmp(D=?eFf;3L(OwFB>YK}E_ko@jj7#(E48H(BAN73UKRmWVDtQ+88RkP;` z)I`^6?4;MjqDVU4{JCx7uXFIW`C_W$XX>19w9pN&0VgN2+6T>XXVHDHZSHuDXhtzz z)^n{g3`rx)#~7++8Q%)W_9o5#)G+}jI2Ov4Yb{Z8)4Fjc&ANX z)lgP|+c#XjzQD+?PBO?7YGKbYLZo~FRS<+39=#B<&(nn>t#-e_GxZ7W_ro6>V3Mgv zU$R`05+*nEjzTUJE8eAA%0)!#vp6JADcT^S*6CLTOM-D=+*He^Fv>^OB|>?@pULu{ z$h~dz#3j8g1yJ9o>O3cG?kmiNbLbxX0C`(1Lkzd|!+eabPCd`$M6u?6qN_sEPFl-_ zcw<6~?`AkctZY95$&q+@YBOG@qLYjZ-H42#Xspd?)?_!wO3;i6Ju(g@WO^s_`ZXCN z{6M?p?sPCLkscv|>)5XOtitGKh_9(s{f@07Y6;1~;EVBzgfx?vN2Rn<%v<6P1%C6N zDZ;S}KpWMQW*7;Kf6flN9h8mK#(t5$Z%a|6D`Nlm>5bL!<%1_s^XW|Y^%843h2(^# zH(b=|rq|e)yzH*3;_iH*R!cM8YQaFeb1vkeE;Hc^lZNE+p*EA#+hc0N zz~h4h8LGH^1j-eG6(823IjRQe-Yq+{8z8-(gW>r9;G}VLR4$MQ-Vm*_ntguXW}NtO z&7X?=eFp9+l2T@6481p5@cw?+^;m6kcCjJUks=Mni5_$ocOT_-MB!w9)b}B8nBPW3 zDOwzZ-e?0LHwCcO{0DW-PKQTbL;KP!dD&lF6037!d(y8GuES-c8d0ITx zFVSXd;h8F!ktG34h2IkE<@quJT#lbMBlwv*PM{Vxbu%$KOOb>n&Fq(;ACajP`}78< zHb0exgq8=N9)UDR`X5#sAFRJV|FYUDG4XJ_{F5=>&1CQEJS|kTh&=371L^7D9yA9- z7?b}SYReUk{DC+4hrL<&Eh!nyBiG&*(H6^s>&~UOEOd7*(7RJ1-cIe<2$aC!4_ z*} zy;9RdW-j|^S5%NVirN=P-ITG5Y9%lApl6fsb$HX83%splzJs9}PEgLRbGsnbod;Kq zzkwzN8wF_VL=~3UMhKT0-Nm?Ch%7{drD9&{5j>ZN*@QqkQMfj)ko-|K-7XJ#yeBI8 z)Ek9Q#fj?Nm0(1*^o;r*N!a@C1Vo4&PE71}vr2;JwjhIlAW+~3en-c{qD=*N87MPZ;vPP8P5%lcLrze!B z8Oa$3GNu0G?Nk~wQq=~TMdXjxtIc*pK+Sw=L~VHDSpbmEb+6v&bl)#XXYhOME)~Uw zXrlfA8N#08;i)4;XgPC)T@*1#g@5ef1a|(!j8boW?BMjRitcB`(2hU_kAWEC4IIZO zPi==zJ#t*qSRc7mD|*1NH2EXvt}V0`to?X$<|*#JN4_1P>p7~-G?!|@W2a5KW%aWr zVjc3a&-VZ6sHvKI7;Mj_oSynj`;15SGeG#MC;Ha_yxf5>idunq=hBsF*VYQ3eR3(_ z3&uNu^(9l?RqW`y^}rX5MXbHVuA262fBL*w*I8f(37-LO@9gxf(K-X7TIx?wF!P@) zequS#fW55wS*XsOmkKLcYaC`kAR5E)XjZH{>{9fIWp$- z3^UGrbn3@W#F?j{p8?0{#Zt_&rv&-v?m=OckN^CaE@d;U-~9CJW}8yXJGFwJI(PS- zbL)G$TE1V{d<6FNO|H57WhnRP>q|3dN8j5{{?&IM?O=U%~ ztp2X{bx+?+7-Sb8LewAM@XSZ5kEkVNoettTEGEpF{bb%2aI0T@Is;WU5;+%}V@bC=$nSg5*iCFYw>d)y?bQZi<`r^STrE%Z=UNp%P zj#fzm?>xOFd!jFV9wX+VexPWv!3lwpe;5`Mgk9Ee&E{F*>-%;31}rZG>X>L1@XrQF zBUkmKewRpp_oYO{%?Qt;!%rrj%}OLl>l*9L+pFuUH#WlyzwdhkEV(`mC8>PppS207 zIE&-2%+0xef}$ac2YgO#t{CS6EcLuK2uKvdA4D>rbC_oz6wX?66@h%q42$W z(hm<#H+l_n*}r)i_??ems^!0aApcBsyyXORwqO+v!y_%L`O*90K#Ws00+X6WKsdtd ze^|<5nxnpQO>a63QEY0P`#wnJ8GmgPYR9+^`RiXl9RYWkxbvk1WZNH9Jzh6I{(~}T zH}SY-==5B%`uFMNw;nE-FnA;&0>kS`FWjWX(-s?Ul;2#{AGtYJ+~nB=AdS7ADDc~0y6Nx=(&dDLJaiJlvmc5srJRnQc+&&q&qjBZ@0tE7_L(r6l z-;xnRI?Y?*+_l8=;R}yJIqP~3yL#^@AGw+>B z%~7mbg>E~TP+wQm7AF@GNt>E~P)3WkHlyON<^D#zu^JwD-BDVt^WCy`L(Edy+RLU~ zzscO>q?`%b8!@sb?zsl5tntUp-#X{Pd> zOOzU01OLaHZ#aurogFHyNO2EQOmRILG%_9e=BqUCU?%fUYGi=4#cN~E=c1OI`6r0I z+h1I|Qq=zWijcH2+~uazdp4%+Idk())Ptp2gWbi>uRS?wy&Hdb=5Md^6N!hA1Kfql zn5r25_A4&?)Xm{-t%;s(5|jyru9S()c9H}?EW<+K7&^U4Ij<(&gnn-e>3 z|Mt*t#MxyTIUQeaiY@worCn)U(plTKWwNHs$|o&NsBvtwG&0mOaazn7*UAZV2`gMm za2p3V0;bHYF~Jtion{)hLP+uikvx9Re_EBxH+Td>@~d69IY@>B5V2_w+H0i#gOU ztTRvC=DwA=zR`3@mg>_Zua7*pAq^R-xQ34u->7)l)N{12noFVi{Z3mx)1H*Q0I8{` zB!v!hJ${@G+^LAvN4(^Jw|bW|Y>ObF@8PaY?n~S-t}^wbK2ntOPrODo@fu3Z!7+da zR!=@;DKzndC1$M?OJq^)eBKYQ>gmfT6jX9T?t4_YK-e^wzdD^L>0M*!4PW4&AQ>uJ zI}_h*9=WQ~f;{QAd`3}wSX7Z~*!Sf#5z8{=KOR33l6HJO_yl9aW%rhOg514TZB3V1 zCGjP3`Qw+jOlwcDTitaZ=7t(Fu?{Jp>0rd`|FRr7)Utf$7rlq}Y=GeP?zQji4a(Dl zb-H`&HoP3%`Lq3+VBoayOEj=u-kxOs5O#!+PpMJmlF@v7mhVb(h1e{y%`x$Jw--Dx z5-v?m>V7GmPYrb{&;PQqB1|hm!62WOnpWE3hXa|JgO09=81i7eGqG+Mzln2!ZBd3n zI^w$1v?@d6^ha5j`Guk_pF#7kKmL~eJT3V-<8G($QT~@xr?R)beX~w1ltu0BB+((? zA0Cls>`%R?PjZtjZ z5>c-7DAHT3t$)J`_J8gcdNJzQEGvU|^v7YT@}FrgnkBDqTp@!B=Z~M# zzxkXmW0r=(`NP%8>Xa$M%x7}XRIC()P(eoI?J?KB2*c@B6+{RwO>2tNK@|VIZE6&6 z5>)B-ie=P#qkgskGdH(m07n00A&iNm|1|D1GK$AtopfBgOzjWU=c)h2k}=i4ec1oQ z1O6X}VwHrj)|d(4UKCp9+V#kc3i94xMa;hAMZDG>7>4=6$jH>DEw5yfXSm}$Mkjb4 zEN&0>B#sZ);cDgv(Ex8IT=X7;n;#Wl|JZ+q3vJ+OqfsJ|U_KA|aa#yaP{imX2(aiV z=7Jc@l-DQu^fjJfPJXP@4GWm9wGQSS)*wppOKJbDHVqGlRx9jGz>*_nF>7lIXH#g+ zapdriz;?Y|Q87`pxHxQ)XbWzsv1UFWmbT1zh5muH(4Z;nMys(^S>-J z>6iIFZ*+L7_3ezV4~I+Xpqe9zxku3NS0{$k_f^IRpvHcCv#$J5$07s1Dv?#9Vf5ji zIwWsOzv8fSZLMGD63#WHA}?aP5VWQ3ZIRc-+pK#KZN@53SC?2y^;xsLnp#A*xf+!xn?O@^El4HGvZI>ON?H z85btQV2iug00ypS01#~Aol6f+T6%5Ws8!>)*0UnOe!5XHQ6A-adAr;r{1|tSps_S~ zwy`0vC+gPGZIJStEp>E?igtOVl12vLtObP-gIlSe&M%uhm?ilDVe)iWy13*(XdIq2 zZB8eN3geLCr+(xn0#(I#H`A7~2Glmr=8CeJ9Yy^HREsRp?h{Z&z(67g@JR1Z^9Vw7 znKSLRgUt3T48ll%98v`6SooWA1xVQ@RL^`0?N9XuP!TLKH3 z1t-f3*&?dBEb}LAH0UuUqZMmzx!mX{MzB@9xL}>Q1tKo1*)e+eeQ>ef_&#GHSV(m~ zJK2WBk(+z-k)g;UYPgSg70m)o1nx?_VT`&sK7A{v^LE_HGQ&ZeM*XvjbhVFA?p8#oulw@jI=O-YMD5w zoR}PZDoPz>w`I*=d(g>RSFY;YOgQWbwV^9Hl9%+|_?8T}?qz^3`HC4^4$Rn)h^7(q zmvU*IQ<=htNSVdePyE`8tLc)aG7DN?N1IZM&R&e7I)|}GA6gGNdy*W>!8_^xK?loi zdoP))AnxW>E7msTW%vbC$Gl=X^N%4yb@KyG-8vV2BcbHZ^?Hjl$154ZlWEbp6keV+ zI(PIZG+?H8zctT>i&sijjbxhp&lqthFSlIQ+?GL^>?`3hn0X%#V_y#uLK)ZylP)Go z)ErZ#NkI((e0m=BJmd{|aG~2+H_>;xVKa%re(H_MIXzKTq(xuaDDk`&<^gr2v+0R* zD`wJ3u~)4S;vM14_AMV&JsOiV?I0BtG-RGP5Thi}(gwk41Cx@p+1b1akYewDxs~`5 z-g|HGc1*zK8W(!3!vsI1Q9V08JM1(DNSB`(4kV;nqFz6-wX!oDho8ec!=&%iM&ouq z;>3Ch2;9^k7GXZBRWiO+U5%<~0>r9kb*T1uv+mxRYiw}q%YG?&{9>Q=vIl#D;>*fz zUS#dt>Ubr)8b}o0Y66OZYKkK$NA;E0Y7`zB>R*#GjOfI-T&FElcn@W;`vy^2+_toj zmh!ZA;F@shtJ^Y7TSg5YqafR0@W2l$n?SOthWiXfav_vS3JahjXbIFc>miSK;RRym zD@Mf?js_OuL~!ezZaoRr?kpdDP^qQ?cya?(M|R<>)e$;)2*Ux9rIk1(kz2(jZ{3b+pH~MH` z2L!FYGMAy$te64iV12)9)Pg!Tuq}gPmabs{-iyJHcyn0CrjtnludwyK59Zj%q`u=d zqxapy_*aLBi+w%DkoX%*ZCoGGLoFW{)Tzhy!I{?lo$?H zkk->wOJ+e`Svt2a=nA@I-xXNHpu~~}WuAWmRWtBNU$y^pM%VD-2vvM~44lCmprsHg z(CVZSNZ?TxU?jDaXWFQyH)vw^7{UZu^s=?(+H<44(z9v;Sc3V(gE*=1m8d+=;4pCR z-K~kBT20CK$)Yl9bGjNc%Xc6jW%l07CM@Mc8dBA0u3mwTXa0m<7vCUEuKxJ^m5}>0 z70~b>Y`U=RIBe}qa@dSW|?>}_yF*-tD&fi9JzyBD4g2#!OUhKiaaN6@%^mshd(_JEbBGIA$XotmY~ADs`-Fg8BW@L>na|sa1c=^{J@ezFZY` zdE^QyPB%}|bx9Jw!gtndlz4J(f?%G+mI?1e|^V>JDH+)memb@UZ~jYRR8Yv4>M$S^8>-HV`GXHh z32o4?RPV7^rtrM4J79HJUOlCxej>)XYx}$G(9D8RyOv`S?!^wxzKn$)@!8_=;RJDt>L;(CTzaluF4*U|jPc@arIuoy8Kcjvq-w|WRcIn|fn>_5VkDK@k5 zovc$mi%JEB`!mf>xeXSqs=I8kg`0xpyRGUnsx%3>1>6V|yN-P9IVMqQN`<1mNy@Iq zeTNJ;{b+M(jI+*?xBX`cJ$JLaR331QS2jrCa)t9L zXr~ICOnY0Bljfhos4#WD{{^^Wd2xci#5W^ha?zGr=pA#;u{SOw?8T7jU;D;j#&gc= zBt+}UR{3RLXNbG=MzWnbrxXahNn{?_k=oN@EO0xCw3E;33;0Cq&e5))O71A4JOi|j zl-NUq&WNQih>qsJ_q?37O_eEHTO!2k2?TU*LI9OQtB?D5fom?&+;LGn%GGsqe3S$* wuyc4J3Ikk_ioR9pz#Pr{Lz?9?Otcnv&_mE6t9{2o^#LropW!;P7m@d-+lRf zzfadZ-4CukK;@>5NVc9t?tv`1i{>9llHef;}E)VO)zQyEO zmr640Co&iQ8QpzQ=|bCgdbnZd%dGT*v^%BWnd)!)BYR}iKMc23BHZ&YZ@PPPDy;Fw zm2hq)>h|f)xjR#VpCvXYD&0^oD47nPOJA}!mrMyQD_8&HP<4Deh2w)_RkmcI(kU$g znD%NX$mn*eA|Rw}?m7CM2}3pcL9;*?@DAPn>F}o?{=sGXUyn!o`}9C&7yr07=YR9* zpw@bs{-=W%G|S>o2U?OF&Wns{X+$m#d6t}>{C&+myc9@AnY=xAta0~WqjwM}SwIekOq}0Ua8arWxvj>UcT8HL20%H>M z;cU?!?)jSN^e;5q^eM3d<%(r%BHLdyRuuT{Iz0sV7WXhq)00C{dZX#XNkjB+$N30;N#`b@!r8Rb8nST3@f;qvCo9ETa zTxo&`=hLx(e?6_e;!#s7A`f#!Ut7N%8GutOf`~KCl5r?94`~7n+A+-3AJeFaT$-jF z=`=r;MiePU=Q(mVG9bY=K>c0XvJ^+nLK-m>W{0Lcd~Y?1+|nhnEoUqw%&S`S1V%>l zX5d{lAKwrS$s&vXemRt0e-9ha`o$)gO~|`0S$~~>NnT?$vODe4Fa%a~+qZ&Cr#Wg| zrM=XMbYS=311PK38q2cVKpl^UKngPFZ97D?^{hF0zu3_hTOOvtOg4*|I1CFJqUMH& zX~dve*h1!B9ef6}lrhyk5UvKjV>m5)z=Xo9Zf!uDx!6zo(e?Z5G%MH3>K;jiT z-Gvi-;<JQcPv+{ec-mIGG^`z!PcY zQn5W8t#jo8z^A56rEQcONLs`an!RI65(KtIUm-qfFaa_?G92W*eXc6+u>Q$`eNZLLBcR4bIR(G5%W1D4LcNlE)wjQT!p z9haHXoGybVZ>TOi+{1d-d^dugPV45QovdL=QyoJE9pmkDy?N|tY^i|%BgM7P7^s=J z()$X#iyOWHT^n&qAwylXVx4gWP}NiKo^XX(Ro{tF?@v<5cn^5L=%tGJjE%XY5M5kB zQpW7RtD@Od3I>WU4l;Lt+pd^H&q@P8;p22VLecQu1-wt|Hj8Axe{uIh9_iT8yqXo?+``%R+qJ|Gn-F>4szvm40q{2(+nx7 zC_r5iOQfv))xd7d?DeodZXqXUDRn+Z6!m_K7O9HmHp@ee`A$A_+A?2%BG8JYR6vC7 zGrT-1U-WbWM+g8S2szw;>3|L~H_L?4HOP-6TejP}SR;YdMFc9N*FQN~vEi6PCPlsP?adY55hP|#FWT>>Cv){2-UAh5Lk%?;1vtj} zJy1GmX+7mK=1*uItG?y7Y|^2 z4omMK7pCI|3iC&3g_rLUhes2dl=0JYncC(ES=^tNP z?69hV+ejFmJe(zWp|YW0s%4U}%H~rir$iNVy06hB|I_bd8k|-2g!nzJ^5&h#&LmxKR{8AK73i-w=R#t zt7h|eJpy{dG!F)ZqB*X7W>D@*F!z~~RYl>`69UE@eiroi(2@9bGB=bRS<9H`RB0&r zR09C0K(DSzJ13?mGo=cwFZukQXCAJSxqd}Je{R(X;h>%Z!5xsdOw`x{hn<3}Sre%D zVns&on_-J#Q~?`vLLP^V^0XA8I>X`5lwhuU%3jP08;M!U@J4@Z}1FD`7zmpnJ1r5es9oLaKjCHq#6E};b2*@c5Yw7cC*fhjJ1*{c(+bt zi=SqU$saTAlD{AD+f$COy{v*%TxUny7_zN(OiMT>wgereE!MxOrcr&aCb!-?a{_^; z_i-FzPx*XzD#FnKyI{sAAxMUNybN!BFu;p@S_v1ic`C(wu(xp>hdII zf;6rjOX6l0xIE{_xl8d!#{8yPvH^E~05g$TgmJHH5{}DlLq68ZD|s#n?$dG7cqgei z;6W$@7;ymWmG{G79ts8ot?drjBwKRluN%44*6_YX;wt zHTDaQk;>-N1L)Foh6aU-xFVJQKih>dkLWKLcjp3UW-8<gOMUC&*Q$C;wspv3Ve7 zQ?!9913N&6pIsX#8!C9EHae%kG+^zv&E&kaI-JWMvJH4n;1{?_E}&Q!UOyv{9s#Hc z`5<5}S8V3k{t&0CY2>;Z&`118(=kP?ld<^eI7FLdp$+Ef6l_k%q33L$%-a2SyRYaj z7Gw?zjk^I}a6%b}Ld_xLmBYq>>Bl?g!@Y*h{4 zOI-;@uEFul`oi3EB)u2|m3>w6OGnCM_B90Cf1aM31Zg_Qc4ep(4)gWs)6>GUE!FpC z)@o__WKIfH5X~$Tjl5qN3-XK_3k!+7?d+nY_ZvPO&}nHnQOpll_yH$H*Q$ZEcVQ~&H~qNFf`z=1IjX-fdv_xu6Dv#L6~IwrDCUlH z5*$;>{_T?Uj~`k5v#lagv(Da81i^6E_W&an;>AsEk2`u+#$AET=++9%#Jg3C16`n2v4OaOi2YPh^2}^KU-C{1g6gvtd?U(jSv4>#Arx zP4!`!;qPSlgqY#O!^&cT<5Z>r?uWGouAPhn4=*UyP5LRv&QP16p+$^{yrLGX3ok|F zw#qb|FwFolB0&d6Zp2uuKSO<_9DP1eIbvwOOlM1L^Q}jKP4NA*EJSh!e$iKdB%veN z5BmcYk*mtWyHMVen6Y5?a z5}7MpWU_9YQ{Uf=?$ zQ-0>hWQaY&Edy&R;LYVQ#F_kCc9IE7ZS}NMZa0H-KyjaObG1R!V2U}H$){PzlzZe5 zzf~dnXrrDIVesgu)PymgQQT9W2w6aEMXvxjb8lAx-cb{|gP4oTxiCrT&R`9e)px`g zt?=X7jiG*%ML*qY#OZU|qEKR#h5H8(7X3v@<#7}8l@d-jH@N>nsf^H+2Gm>I6~BT= z`(MhzhGG5YZ?9Ib*zRsu{L!RJwJ%J0uuQl#MF#aeI8E0IW30VS_Y^R~8m_$IVVA@I zFc4#=bh<{NIieDjTOHGkOL|}kh7gJ|eA;$R05F+l*E&x0d;8Ih?y)6WG(TJ^uMsdZ zt2jZuPRST3p8aRP2&Mdy#{V3J(IQ2$9^E4P&QRD|{mZndWQS`o04?)o&XNLkH4YM$$Ol$=TA3qbkc${u+3A}VuNpSw3J*EW%tSnu)quvE{)nMf9_`i`bA;u)WrF)^zCrg4 zq{a$=)IkpH573;KZ$CJ%lgL;7dCK9t#3zXeqR+H1j^s{tgb#4843+UGaURfQi(aP0 zwmmMLl;H?J$prI|0L()t<`q2E%#@^-3ZP?MtvDYPLg6Hqt4z0`oAZl05z;@Q55+b2 zdhn#G@X`U)dn`1+Oo|$818N84{lf|UT-t%L8RQI`IcW)~>?L>q;G|+(VaeDBP#CSZOxEcQ4&xWfmtzR17b<;ebD024HW4-$Beq;cs+rNL1G-6Aa-G8;-R_Mwo}3)E-91DQ7dLdV)iZe z_LFVvX^c9~N4&*a$(yt}=^AMmps)qoFP?O|6I+MnE-Z?`CnaP(vPxqMnnNOiu$cpO zD4G{N(8<)QOrxz(@_`+)d~w8hMA#C?kQmd_E&W8b+`pgF&t0 zH?qbY$7RCQGQRK0!7wC{{9xG%)ftznQdAT)F;$||6h?8m%YpS-Oh&;^_lE;>m9Q2H zyzLOSl4I_7*UTvi`s^TMa>6z?!6sd7_>c_LJULnX+T;!B_m$JQ_jNz>DQ_|bocJ^x zIl!ZTL;IBjRav*@gzw4)IBn4f+Xn=J`Oini)3<@B<7o2(QmRVj6p2k!L@N8l-*6Q< zVdegsxJS(BX(qctJ#CoVq7c0j8S~f_vUEsNE>4?<7tWRS#=^3d1l;vs*rW8-=mDo; z$y|vz?5>{a6f=Wvoxtj|&t#vZidm|)^bP##fF{w)X<9CNc6QbZ+wa>fqVZMMaeTB= zfYbD0pkzEKmT+7_LEd7=-nXR561Jklf!uol6p44F=Mpff50t*_6dmL9mPWBUZx5_t zPQ`(u{Cyn69C9pmVlrO@Dvzw&$zM%Uf`CJ<(=z=R>#9zp*Try}t|%Y#R%T5xzE7bJ z%1yv;In4ZTY!C($7A+DbnfU9|KgOd835)Ifhj|dL2yVM#91-?^{rMA~@jn1(X#MX& zmX*u&;i|C{n?D0Khi|*zc24?&-W;wY>zaN&?xdab{Nd|K67$66Uyq}Z>%6}LJ`XW( z^7nlOeE7cq4*u*czWMc5%8dVyJfhSd;=M5Kp?Urj|8NQ0_6yZ+ve3vnw^W$e0 zFZkz%dftjB{bb%M(*OLc(MupZ&+8HbZhhv-qUg>F(>zB^jkFt;Iv&g?4-XzWNh~e}6xEHZc{79d$i8b6;AkdI!~`3-`Awi{_`5FtX;Zr790l zd+3=co1wV#a^q{vB=Bpvk%JS*kTE;ju7nxpDS0CR%u!tr#mxiOY%2m*0$7vOfy$nN zn4MzQe#u%?yJJQz6!+2oHWxGb!F~^9ObldmNy;l2vtLWaTmMazrGcK7Mn4^eUYBZX z^(J$()_Xs9Y5K!k``hGeNn%!-ooA~ z?EMJ$CfJ6rUXt0>3i{l_pdq*M3Sw4NLZ3{k&{_}^^=1qejLD>FA#7SqE|-ZRN9eG3 zhV;q%?PM}gjlJT*7 z_^no_*ZNMwILzc(|9`a`&Wn~B*pyE$c9;?LoN)pAl_J=*$othA_3{D%rFp^?@*slB9pbC#a6oa1&Kt%cRlr) zy7T$AbAKkL7QtrjwI>>Cn)8VsLnO_Rip#lbqWPdA*~jv#1o2q;B(;X1>gQN{kQ~SJ zl>Q8Q+%uIZnC(QSToZ& zO`4!dx?>9Ghj5;<)*+y1IUDLoMk(#1=_t{lLUx9VI)z&ySolCil8?pmBCBg2B%ncO zFzY@DTlE(HrxZ$05uG(0dcYBbcdt?jny_QZ%ehKxpmRf%t^z7s{T*d6NzKNPS}<_ey(JwBCF7Op2BW zY{QnBCW&gSJ!6&Ha<;3nvfE1U+rmn*3DLPZzE1A!;`5wf@Jg?rG<(;*q_Ny$O!JQy z-GRVqt(&pA>Wzr8*nO(7LfrZvti8{V!N?2-0DtqR?FlzPtVl8UV#4Rve-1073HEQC zn|Vo!idg?=8}Wj~)P_JchK=&<=vMvW+H2dZ7kD7~Xvz2;=Mwe|0ju4b+OWg0(tTH>L9G#nLZbJGs$C3;)}j9v?;dNJ`6 zR-cQS&iKV#+ioog4Ka)$C*jjE!W(dYeK7fuCJ&DNaW3oa2F83Ie^7zh!@bsh;9G4%SiJCC>e8Vwsd_J2Y~4Tm0#xB;eoWy-crcJ7>X$zO$nAWk3YQWO2djCY``;pWDZICzMzY4(Vi zSre-fI=4Beh=N(s@MrwnEz5K%A$hO!3vdJLQ}9kq=VtYZjaDu?st1hu*8IjV5oPqX z{ak+F<{*g4@EzB;s%*5S- zNicAM1LZATwZ_!(M55?yI({;%dk-;4H}~_kQR>AaQC+wf-*N1AODYVR0~R{-IlPD; zOn#fFL6_hkY*MP7?}fFm^WJ^;uV4lRYqntcjjxs6L-_>Af&ici?mRU8t2EE-qOCM- zL>~srQt*e3#dwY84}Rb*8y!62kNy%Be@tACRK_6T@3_Px+F$3kti?hUr$pmV+SPT#sEk zu<4ph!{#K^TIgQ?cqL^ruFaM)H2%*2ju4jNfz6xOdB{;zdOxWQdC%XlOn-B-d8!!D`pJK@6Z0Q=0&~X7vFt&Tg1G|Y`zDQBK3&o|Iu z?|U43>6%xB%1ZgK`&`$;E%kjoH2Y;XrPVKaaJ{6;pH?x-wgCPm6IVJ%K#n~oLq7BrNYzr z0^xRAVHca?znfUKkr*ODxhk;{CK4IWAvQpoeVrEL+koYVRZTbyucs=Pm6L}|awDY# zE8KPdKFL!;WuyF8AbVJPqn{fbkfuU0%Uauod^H#RnmnswoAOVa5XC|IV1xDhD)WWw<~eAcpY=c&NxI&T$~1es zdqtihG;7)*Zyx9p9~{I2NrNdwA~C4pY;DhNz+E)kGw70`-gi17{F2TtFC8a<(`FXm zY|dwfJ6{CqU($8iqJiphR_`Q*FCRovhO!k>QWG}e87)IaHm+K`N5QKW5WF}KH9ZP3 zfUt8ARkORi`PlebS;edgAGr%FCH#8H!=1)@20T_+z2R?Y!h}ggGYwYP2p4u#5b^!4 zgt$>U`$8+@M`E&atmdVP2Sxku0|+zcVS{x-gSL;}%`vh+bmbHgq9 z$-4ZiC0tlyU3v_|j=yoBy54OQHvgxNK8$ zMBj7R`%X;MU_a!^P+m@aZl5Tm!|DyTULmRO9!E|fp!z+H6wu6iJdSw*2N~)EpuxX2PuMEt#YgMROu&mH((@vQszlE z7Z&7`;B=8xRB{OdcSA`Co0V#x&B~$faU%@TC=37%pih7wYMO>>p2_$X!o8R29-4k8v{P$ZiLCb=gTTNq-iq zyjl4%NA4BBa{p##{aJzN`Ly5`BARLC0O4EyWLk@4vd|h69=z#CSpOwsIprkzi_3#D zE;P8JaM5{EZJ0Elwxuh&+_oAb+Ed&E{cc7fih;Z~xRN0e*1L4eu!qB~=W3=x>du~- z$ZD?W)0y<*3>z)eAIS0oZrMW??V4$k^D~?IiU#{_)X`Ro2zBSvIrTwq6bynzGY~vL zu{=g?Lron=HUmyYlR2$BAzhzZ3?$34?ZQ}sRNBEGHv(iCA%C0jNRGBX%0N<=bZ1~+ zv%lGL^OL`1_Yv%U*RJH=VDY;fkCG>=d^avH|Fu50E)*iNC`k8D?A~(;@QQa6N%k`k z22Cw_RK;Q#ElFbX=8Ca-h1mf%#(3J0qn%Lh|F{!#X)HPef3%w#M8RAHsg!DRi z)qfeFCGp3K84GWMd$YPE)kT63z7;H85ELUugcapDrp zj8ceF+!y4a@H3P_xCDFMfY z)mQC!k^$T~GPpUDDAtE}HHobpDeIhYEL*mff+tj{A{bmHX%cr-?5d1pgjMW~2NWq> z;e~!fsM&ib53d{iq9*yRI#{RFKFHHjmCcvwW3RW{z|olYLg~HQA;dNT`Z4G624Rl)k-MQ{s{xZW-+xBxnIO zf-1v|TAe5Dx@2q+h6ML(9Cyfbin8OwN9m+4RTei>y=gRG>?r%Gs=^2K#A-pnh?D1{_RGodXV-|fZ>S>}l_>J_5bF=Jk1vL)7C&gr0484^V6Aoui=?SI-5?r`pZ$X2+D_mAPSQ7n|3 zBf3;6?4cWlBFHd=PMQ_yrzmMx0p|IKen`kzUJhXQNc3c6G4*&UkzQjaE22r9ePoiL z4q*-?oVe7+lwkZ~L&xe1Uu*1l9+RwR+a%XcQ?l@MZD5`Fgu=x5PXVVA<0S_-2(`5G zvr)$0TLrh93p&&NcRMyaWkiJosKd78Qy9Kuedvzu{vn@sExi$*m2~&Y9ez`}v=Xo{ zIyOpu7oFvt^gcj&XO-kk$xoj(X<6(8N7HurAplWLtg)tV^*az;3kjbbPfWnwO#S@C z^@*u7(V03;DiTz`uvSrb@nCVH5U9>X%4jlODZqR41 zU8X-iZeftDr`|eoi?L}`t*zf7+dUUPY7ZjZqW*}Dw^;x3GG%`*`gBd-b8_`eP0cO$k8DWn?LLCa}RW6*C%P&+l8{ zm8riG`66j`aX-kiYD-)?x?@`MfehNw^l!>KlLCb&!hEB3tU<$X?GszjNb2W6i?jW>x=We-S4iJ zg>3L{vnyYk_|VFxR(rdyX*$2q*#+%qrL9jE%{-I9wSK3bUM&6}cK+sA{L120x>?;w z@&;{l6YtPBW@f?UJG}y{6{aId%}#@OLA>};`-5(ov1M^_wHr7Nti7mfnk?!9NjaVR zsg*n8E6(2(P>i46$|#2Xg#Xn$@N$juzpk$^El3hJk$#GO9ybbB6`~ZKlBMqooLvS2 z6$2C>x)yQaaO%rA8ecR6olaj#HCSmX2_!nVhhQa()sO_Vf|hv2MC(YQ3OP<}zZ1;9 zP3Ra!`MV1q<;jEDdEq9o(Ddt?uOP5su)K@iTQz;+yUlo0gzuQcp5r>5 ziT4i=CKyeO*YFg~KRDremvQ%1(@#ay`lkxQ^LY- zz$q~`0gX*>DP#Bf#u&ZB zHYh!=oB8fS1*W#go+mM9)G6D`0QG5Zz<29yO9=gO=sY~Ei<-ECpR+zdofRrvh!G`|He1oc!g=yw$e+U zw|sd7L(TCttWYQQ-csJR`+Mt8+oSE<)i=VZ=RI$2BY!v?S!XWe%TRtGgx4BpS1--nWAuw#0Jped$KWex7d(6fOt@_Rz>G~BXyiUsAk)+M z+nW-sDejrh&7+|5*}A4{f<5ntAfppgD_wY%E*g4kQuFzax=?3qsLc+Zd#qphi%W{c z)L91ui(-h`KMslD!;R^}F_G&pNHoBMRC424?ueTo6W=Lh#l4-O5Jf>_W~$9Eyam^UeVkD{sr+ z7r9KoPVwHlc*Zqv;1Z)zZAD;$2X|gu<@)JN**6q|C-`~vzHfzcb4c4=56+>1$eS?3BCcHXm6_Yu}+?;0i zBVbQ-`f*Mm%aTQL@*V}XXT{B4X_C!oC(d}kpQ31%f`TUmD}j>UEna*G?(hU%PAAw zM5#iVc(_vQzlZ>?mXTx-NH+N^ABL)A>H+w{|;qXxnT=)oB z^3BRq8o@cr<>RyHP)*Opehhj>N>)3WIl8~Q@GFS*Eaj|g_ZxCE4@`DxMx=b>T%VgL zUE{Ix=)R6`MsESTt79Dxj>WgF)3sWu&@4KWv)zv3TC3>N@-v>1u`A~jUwy=GS?j&~ z0IYvI@1T~Ja(Hnj_zm+J{NPT%&~+AOd!hvcwmcm9qbveoTuY*=8(p98=!8#XQ#XEJ zV+f;je|wGxgnbf$B2HFt48O#jHv4=!PBs`S5v!6)n&ir%LX7WdrFD|(sCkB)bbJ8F zex}?P#afp3d!o>RH)46i7;%1dQDEwMrcMesBy!g?NTiTcM27Ez#Uyhq;sv+}Sp=$z zRz5h+@#pYti)Si50VfNX2Vw>5Og*h(atm5xZQL)MBM_%l<&m0ZPW1v}a1!fA5r(d( zrX$P+oH^wwa&D8##Gwd%Bg2ncc|@U9$c9Ddrfiz_JP;nseQ#B~)o)F``Kg-;+cf;w zO-ozVn?&Ht8aHAgbp=a1cYy+0$=H?9@9}F}ucngOw%+?Cn~^B>CY`zoFHr0$Dw_c# zY_@arK(+rRxGoH>EA1!|LX5q=>zElhBQOs6@VLZFz;jqxC+0qyb(~X$(LBTK z=JZ%5XGnY{MoB^vRqI~J^t{<@&nP7LA`y}HN+nVdLM{^B08CH|v(bmL*!te6hGmq9 zT|^OMac->y;!*%ERFA_s-IUROxX6asQYQ3qRYpJUrcV&eW$R0r9J;dQ2wmMM-&q59 zEx$EV{n*(h{N}&X3{{PL^BJ-66|-?W{xPa&Go|yOasa_Jw7SD6+lnj2ifoHtiIG!1 zeJCD{)!-Qvbvd@SJq`@JYvoP%d9>Z7{r9uNyWLr*mbwGTcJ2+)C6ld}bWn6&0 zjiz^yfZ}#js5HZs(#y8W-C8f!`;CFyo{cA_?2mxUy3>I}-7!j?Z9k?3P?n|brgiGr z&NX)qMgEElkceFkjYLM6uAYJ}OJFx{ViZ%MF{U%kDq7l4`uNr%DX298s0npeR}URJ z*K^N-buH;#cgP6Knb8c{4={DNQwSmW^n3jQ^C)pAfw=jTj9A!S=F3iDXtumE`{F2l zC1e-2JesgBj}s0wkwGcV-xVWs*&!66H|;kt5BdFz4ON(|G!BOlPkFb!_w_MfxBR+! zd<*xm`T0F74KET0n}=r;hFr~K-OU3sw}OdB5}n~xZizl-jkVD8t=sBQy%BQMJXzV! zAMrz#&D@qp)j2o&ba)&*TjLv5?!p4D`~#LyV5NdQeAG3jzF*fA#Ae>9w>oN)tbVfs-8Fz4c=O5eZySWq{?G6vmZI? zX!rheU{}=7o-(s7~no+6clnTXZB!D(oX6MtGVMrkSeNHb_IDX-51w zvpAploB=Tt9KuRN78HIm`oo$#^R>1keK&r6#;{_&`C!w;U~gae$JNeKFzrK^WtdHe zhZy|R3+Z8Ko=S@K?6B!!bvxbYhW}&bh*>~p76aB1*>-BL6OUY(B=L#4PvP{)nMciE zX^WhS&;OZM6IE#5C!B0yo#a-#BO*pi|1}vtblORvq*>>EKF*mE|u-`Z=<_4?ghD!L*IzN|$J{8f^7U6*_uJ zIxAF5Gh;0uz%OpK+*5r1wfSwc3m0#Nj_z|G;|z4;0>;EBHm2(~0)oMS{_|(OVNgz0 zwsQaZiM9J(m0>LTzJWOkA;}v7(1-lo#8U88m>`@PuNmtn&&x(>(9CznO_mVrY6WBZ zlT@(wBR0g5gr|je;qW(->e)De23MLVDZMwoni_V%32U6fao9q^0ZUHrM#Bq%-h_4 zwb21i90QW{7yZa0Ny;N;@9r35=Ba1puF~p4H7;30s#AveQwui()amufjWk~9t_2N` zSvz(X+%eP#`|aPO?Ujoe_CZ)^Whwb>w|VStV~hAdn$u^o;1*3o%xVIKFQDjz&=BLs zCl*JLG1H z0U7ZDk~}`%?0WqHUj6tTjAj6L)L2vr##pRM^s@XO3{7R8U=UDJ4|usBKiWuw=n~@` zc#>ebnnyv}IcT~>7r56|Y-5j6Rc4)2WS6pO;Y*(E_Qj~f`jcwrtMtYlO>5z_F?NQ%XT6;aXuf(>55N zDH*?wF<(<-t;j0OR`y$JaNB9gGJw02Wate}S3f*meB1OX7i>E3hp!S=R3>FMG`ei9 z`n?kV@Se|EmPMJlPmYsMTd&ynVuM}4D_g(sjzA|r7sZcQK*Kj@8Y)G3t4*q+NMHri zpqOV`1;5?#9tJj1;WD;bwG?9S#iZa%+pKa>E7Mgz=LIKZPW=qVpeU=b zDI@`drE*%~(%S^0XGe5dgvMNzb%=(4+a2ld$Mj}SfGm`jVEU)y95eBZB(joNm&~U< zpO9z12GJT;>SBvrS9-zoew>bNNrsb0-SY&qLz!G2a*t=OuIcYpfgmtb5f0)quk-iW zSwM6;hxg2^HhfI{^fvChwcby+CoUhYUA*QVLEIJm7mV}Q>F+eu^(eLb)kUk;0)g3o zzg5&EvrZM3dgpKS=da6lul43R9CkW@UTosEw7@5UYaAuJzoJm!e#LRHo&vuCfvZnI z$L9%4%cs48NB<9TpZ}8w)k?tq&1aOj$nkSJ zld`TMz@xVlYYR4!wz;l{Z|~0iO1qg991|0@gP+yn+<|8gtEG&e4s+hqR+t_q+;ukw zho9gjQ@W<0NBnTOvuRZ{j$Ugq<+Ve5`!OTy0rwB(@^fX=*`TFvn}2kzrweR~c`x zt#{X(7}aA(=tu9ye_Hi@f6qCo%nn2u%fOb$0i%eL&z|wAHCeeiJC7HI+^}+Ka+-up za6=Yh`kUIDMykW}ru#W~Ra029i=z9={0B;h2Wnc|RMpVxFMi`wGSDz79tLi2SDtcn zRl-3DgJ?kA7&zgr1NZhSHPIejX#;??jlGasRH&*5toUeRz)nHJ5;Oz(XQMnbcPXWqWiqJKagwt;V(&& zaOJtjybzNrD5a(5!hb397~bZz=dJKi;(y%_R-6^^9SP`>!ByU98_&9{g0r4y7Oy?^ zmv+j)ZIp^wM}_vY{V0>k7X>6-iO?#!v`sK}^Mi>5i z9$4xWs>(x-7?@8JoN7iVkv>LM8%goB29J<661Km@wG3Rj8B*XUl}^i3c7TQ?`Rh{9 zkUV|XNHcvmdN}S;ZqG{hzlm221x?z?A~pgk)d%s*h2e_L@4z*WK4q{%-~k$T6z(hO zr#`P~itca{B`M)57}SCVd{^mh6Tsde$Dhws4qc1tFbutm5NOHUzaZZ4?zW7 zJ!1Zw|MCAnGZ3!<1cHoH&+Gme6uRZ!sgAxjIR0l{#-b2%ie~K|l?{XPgKGJ${)+WS z{vzA=r*rds-7kL${ePpcsFH8fW^KGgXT$sp{<@oJ8{J(Ny-2^l{!3x>^pYQ5<_wB+TxGIvURYT!zU{D>xDKv?{?d#cegnS%j8$oBUl$tmAOG^a zW{zcaDaSj(K_Tk;;pYLqW|A7l0Qa_ceT0Py-cQe2Gu|5H zW%iBuuYq_Z)N4h!eVt=8uWHsg27-nn!RFL*uLNT+PP|()b2S9|nU|yf<3EG>)CcnK zQt~bBzvX|w0TAY_(^RUse`hVShlRub11x24)ju<;t4jTU#bEc;c%&+&>dNKcb;;}pN zlR2yV1pp=tKdFs>Yrw#VeVbO2MDDgd>6^KAQ3D{=)Cm+xm0JUepG)cMpD9CEW5>z3 z5H9#e1~sZ2ackBVDukv~V|BIMj>u^HKQ}5FUV`5 z{&Qql&H?U_7S8&D3tJ1BnrGt0cdC68X!|uEA*%CSJb;d;|5I2qzKsHO}C<-2V3pw$nVjPt6j{;h#I= z7QPLWVP%<`DGg1GUtnqw+%5Q-J7LmTrhQ+dYN|mGS7BZsUJ76OjX(U{O4jYIZ5X0xDs%j>gwM|%gB_T`-gq;Cj9Y29*lrq|H&nwS* zY1R_8{wt<~I=Bh467!jrS-TD15z9d{0}I<1!~YRQXd0CinP&KOU&scZmjFciSK64h zYvI@~JT97zj2t*2`vc~lv)#-lMbunw{cEh6j2kD{G)tvYFRw3NLLc^}KQi}YTjQkd zH4(I?7n|xey(j2>?-^U>li)Mc5VcYeri0Y`Hf_gu|72V=TR0}JfT_anu2Dd{VJ$!Z zR}R~{I0OE_r9H{w-04+PbUo=mbU;Z=?QDGU1CCarYia>zRoqB0uF#yGho8^I*NGwO zNy2m5v=V+1qofM>2FncL^MjdO`og2~=Sg_=I9^pwRyE;kvFaLvrc*-}Bh^ZLl{t4Y!QN0RYR-TvEhegFxM`cHzv{^<8NpWbf!Tww%UP4xv{Z0Z-pYW^)&(^*xT zECp13+;?H27C)({cJ__UgB7~{NOyn$mcW#G9Uyfg2`{yXcP=pRoK7@ zt0cJddxrLLY?n3Giz{Tp-YTwnEFAHT%|*^8BhTx6TUh~jg-Kh=1+e%3E#G1ra3m!C z?98(0J;fi^42~~0SefG>=E2URQQ{V8ngsa=s#8_mf-l&!fD5>ti<7OzdW3UI+dzhE z0q%aSNEQPEf6X$3ffLUB1g0Aos%A5KGUDAIv#|;kNU2TI(h(kL5RMKO4pI~e$gP=` zfq|a+CN8zS%Ni%NuEDb5vw1bMb}6`_g8>(a_FDmsN{;VPaMXS95Ld^-QK?475Ev|j zoMALVIPQ+YX3EW4QU8&sz^af%UQC~hxhDFK^HMaJalsBN;`3H8IG6vF&%D4_dsmnZ zs?wBO{yjL&Tg<s#Q;J^XEk}D%Ftr z-9Y*#PML5)kW`>H$t^vBp6~%003Gq+CTMu6ljRuU@T?QkH>46MOxBL}mlGK->q7=8 zNk*P74gAN2yLM-E_d8;bk9F4LP5OElPjHYCGJ)wm8ZunQQPmX=lHJ+XllfdvijWVy zN_qtc%OC}&`^hHW718|zQiU`bi#gPadtljmyfv<%!3){r86i3lsM-Nfu{_iz>ZUp9 z;AMqV1@pjPno{I-KLBYQDYv<%b>1;W_02#s=M#Wi?3!+`g?gYk8|t=`K!U}I{_*D( zpjh!5C|1;xv0QiUc&e7}_)@>I#gufGdlA8tmK0eXb7sfA@PZAYlU&dFBv4oHeBzTK zrF3vg!is`3F>pZV#T48(bpB$u)O0Pa$&`x{K1uqfG_gjmdY-aHOZ{b3*|5w{iEyZ= z7F6dFCWjqMp$3^WuoNOu1e6l!K7RbZKYM&Hy9GuGXf?*~S*nl_rVoN}Te0JdXF+xo zQjkA&IAx27Y!AqkZeq%8SUCa20xZ7BxZ0L>M79Wd=IT0k5quD@>FS5(^+E)TRyNDg zS{XFCrwoDSXEY9URy0|DR!5JwTWY zVJ1#KTj$Rf%(1{dzTSi$wW zJ!spA<+H*Dcp6+xd>^!I8|i(<^0CDW55!!MI%>a!a?d{ZcTk?YpL6V^t7$0G=Cyy= zM^R$6V$w=)o1al~vr^p{6+6ce$U*LmQB$2gb8J8htU{S<$_Aq5e4@g~&;F7tz6e=*ha2wwm#JW3t?0_mhOl1Z;9FHFLQ0#m^?-yUQZZ>lLgC1XcGb0&7D&OpmZitZioVu7C@kz4;LyF}Tr zn{fsGjR^f}m%9>w!;hKaF-)tDkpy75{M9p{tEfJu$m)4`v2l7S6iXSl@gI>;;Y_LA zCn_aZbN&6%6Mr9SlMbtuN=l4y9V}Lg!mD!NcS&biu2P0ciRZgaFS{`?`o~dscvyUeeW;XPTD?T5pGoA$6I-SjT zW50o^8RA57G7lzQHu=yWT4viUjHU~VvEl==Dx)eJ<+akk(G%vE31b@W&?}moxXZuD z`{^st{gH;B-k&Vk!>1dGWm9K=I-D@21+LDB%*%*1X08|F)GN7eAKAob)p)1lE*L=3 zX~7H796kjEF!N`}g-2zU&yH`w-0=YlllxEN72UY;9r$7+S4LRPSen0#DHD^JxE==n zKG%^l=17jUeZq?#!Usl4nCuRi;$jj7;MmoXBIh%)^r((zn7eQVd}60dI6hBId;6mT z<2|rFKslWysGdn!I~8VVc%IQM{RgMJ`@gzL`FYd+U1(mue&d0U&RODj1n6C9;N;Ul zKP4quSE6?uUP_SW$PO{lQVR5;6v@w#qL`Jy`70eR8{ScbAEeN z$txW*AF7&PA$LUj{wDhXyt~qtqxfb9ManN_Pd2dqBn+7tO@^dA8P4US#a@rfT!yvX zSJo+`8j7*qzX^ zx|q3l=Bl~3R*B!bRFdnC1rugJ4xXW4{X(1RaCgxy)24>&?=hjed9}XAHa@(p9mdtA zQ7Ruzq{Vha0(7b;8LSyrp1bZ)#5sC^|-u<^tN3y**(g8%qxuk0d|73el)?N z{)eF;(FUm{$P1SCRsDVr;m9}zmb+@x=YUfS$aRB~N^ElUOAF!n2=$Z+J)^rSG(J0V zi*a?b`(_okEu!?5i{}V`iBg$_cOD-ip?JnOcuI=UqJYvjE-j_=u<7|+#N5;NQ+;Jq zKGCy`qfnlm=-|$BI|);WY_s;ET(_<+v*cL4&0+C>2oSapGr4iRbht!SauM34Q)JgS z7HTB4P;j-JISs+Tg0MuOkszLQk@BtpjlzyM^=4g*?eN40;(I`Ipoe*(O=E!9HJPg9 zxvgC{1n9*mVF7yef1%e+(8I_+7e3s1eC++ZqK2uKJ0`wE9kPjEV^%Hnw^v!BT3RmS zgeZOMkE<-l$np!qKpN4veisw$*3ehzfK-UqC*SMad02jq5YcUSF^ zJ0qR<(SaEoOo^>(PP(964x5a~-|+H6oSv_*(NowFNxVcd=Z#mU8QGlRe44AFHcye+ z4|(*&EMhN2W?4NAfMaNj0m>K1=6$qa5q!(&vpTiD1ZuRFu4Qe}KJo;~eT9C{mYu5; zSeThL=y`}(LpkdL@F$PTs-P|K0NnuLD&0TE;}(?@9+_+7E~_08kSsPnJ8bWpBO z9xN{k5UY+46*9Z$usgc_WLC7wIV>h+@dD#v0mZX=+^P}7UWF8dDVr zAx0J(Y=O#`EzkiatB`Y6fM&3{ULP`SL+7p5nQ=!9!M8Yy$oBcAZ?f z#jse=0fX(6C=qkXTyl!UJNEs(z{8JiT&q;}Q_onOoPCj{aNlH0NFVI_{d&KcOGT&p zhd5n(7ZCPxg5h$&H_7>kTKuCJ z9wHIuj$vaFg6s3IKm&YOILB}_5lTCAw~*Tyg|3OIrCs*yls?F(XUX}>=*vqP!BG!1 zCUT^|@Vjm8dQA=>f4&x7yU{9O#o$%Lu0fB};s#m>$DG4>d&WBy*7@A0Gb zS?|O3T?Luosy}4rdG^&{2T*bJpozL3fO0}_sFqOQ$qR>qZVaYkL<1x~@fYHj= zbiY|{yaZ;Gulu0dRxA2{jrKC676piAeg17C%ggV8h)yWlZjyQqISo9EWdzAq}#Q~ zK`od2%vi>bJ3F{_gTrf-&q7;y_qjc(11X|>p7f}n7;4yZ5?LGMQgvY|ERdr*t71<7 zc<^`@ZnQ3=`=ncwoGza;zS{fDh?);wS}9E1`i9!Pew= ziu#f2KbuAxF6fmSKz^1i**)&VC ztzA(Av_+7GUI!XI07!tMR?66p;%&YyvH)Ho+N#-TJe#uArcY5}-+gu(uJRf3@SdS+ zY$+3-8 z^GbPkY4tDw*5)iTBldMjy~dh+IVO+IY1ki5ANWj>ijSuq$d7U63(5jP%wq%Vtc zDzG0^YXos;XbcRd40(4(+p_xmJIFFg-9rwNSY|B2+ys|BF8QoC!Lz{1raC?9th$<)cL=TNM==^{UM@kd>@XJJ@9wI4FrVYoh*(9wKJim> z7DriOD1IiZ2)1dnQdc!vQtYypZG4{oyR{nf$~6P$KGJAahxC0%M_)(EpAzqDL!wQ5 z!G~7hfUP;S{ZgDNhJKqcq|oU)!`8rZdz>w~7~^HW09SWpa*ejGzpjm?>q?$+pOAo` z9P3pvI8TkEqCNN@mEvM9#muV3tql@Q77%i~9*@`P){tI9ztV>J-I%u&2P!DOU9G^H zJHy_<%6+D`^5pEx+wre$glUtKOzII2sFl;8jT*$aHwVWH%g;PX0!u5~F5NkSJABRJ zL=U4o2!!f|wKF=k@6Quo7*?a+YLN)iWP z^s)G!u(7IsTe}t7%+>|jCR={&Q`6|ipe%`AFW==PdGbI9Q|H~UUoo#&YH;tVC~P7} z;~BLs0#{Hl9+3qKBG5f=Gy)PUfr~6_%NZ8zNNk#Yu`rW5irq~yCRZcC`Wru|r~xxE zd>TpE`TMtBk#JZjqh0?StM$Hf-FL40_t%Ji=eqA)_nqrLd8t65eOG+I zzy{zmpG{-%LH}0-H0};$bf3Tt z9o%JLz%TzbDZ~tvgMdINz{+}HumANg4FHm`M#?AIH+g}`Yls+RH53$xAnn%F24dh3 zzVv)1y-f!RiZpq2dD{3b7JzI^|M-^&mz)5>+?>z&T`Ti!KorvwI~CEC8_3>V5c8Cm zDT4=0IT5~ekP2{+*NaYbl{1JG|4Ww;%w*JnF2*ilP1sn65Eni+?u)iZZ0Fqel@HaJ zSt_PK<`T&U8t%pNqS&@0_e$%BK7g-Lf%N`3!fH02;Z|2NkkECrfrg0ErGb&BH{`u- zGw%TqD3+UL^a(o-Axb9(13Z`+M}P0CD&dT&(%r(-4j}~Z1|^M9TZ7g4X4N^3!GvUa z5^RQQ>w}#}-X&HysjS!-&uGx2g7FG<<+u+wnKEd&xzZv`!uWk8r0FJN*&TU)%zkvPCWR;=?!)&2B(mF3*T3Yd+LXzuU2f{GC2?L zRDu4OXb+cIdg#5vM;AS_KH;uy@UE1u@!ZlW)#g}$r z=f?l#u@BKk_&{nl`i-UpLA+vQbals;9u6NCZ%?_7l{K$>t+!e^em~O%pcKc(@>`Y* z3K{uW_Df9Bcu8un4)qygJEOF}KTZuKq6VQ2igqdkaG7<7U@l~ z*V+XFkJ@f5h2?AfE+;pt&>Q)P81i2pzSk&8KJ zCgGYLr))@5RfE2R9d?#LBt|)?(Hoi=KF%AL+-jq_dPFr~B%o6pB&%9V5WTFu^5%)p zj0;eri$nI2^~r0Q#$;$%;M#9nKgoEmvP=wW?$M$&A3uC|UD$-9Iw7YLj=BLxmPmU) z1`2OU9*k@Dx(dsZq6+)-1^N){11G@X>%+JU)ZO%@ic2;gFmn4*Zzy=D1u661D} z`Q6BuP4%MOY#4Rh$OM2Xx|8_}aok;d8j%7wG>S0;Gkrcwtnvr8^|)oxy>$VURq@0F z@uj(Tou2L|{AQ7vLqX`|^^?7+T3d<}pAWvUP%$_ec*m#T*VIU7{>yi?Rl@F8=ADFp z`r6)3ub03qX|Qbv092|@lmp&Y*lKGh^DigB`lWrNL7A3@zZy^IUq^W=F`+uCY6AA? z)nYc|Nx8n8Q=)xZ^D0j7t$M*KS^=AOt=6ge6BQz$MDwr%|9HGLjxp<7uEj#06lSH& z8Djhti2rbtYS)<+U*d5M8M>#TF1Sb}`&(eDhP&h;jO30jQhGs_r0QxviS7AYMN6DT zxnC1jvoW5XE9A2Yi1V?WklOO!#h@EI!J{DYA|qPd#e|mLW!@GZZEhbtAjZ<}R?5rP zW@LOrmWn~DIKI?VMdNjf(Y;=2K}Zodr_!#|nSHPW{W4K9+|2ZJP+2J6mVm-2s_o6~ z+Lj-rqN=!N1^$AB>Nv((9je?_rHgT}r|;!5QZdS&l2$gQDawS*^#t$^5pdn$Z&^0Q zTz;fphc7JYKT<2WHK)((jCu5qC{4q0^gwHUTlg7s!+9LV*%HpN^JbXys+k4ok@6QM zvH+-W%`c<04Y+{rG3yhyHk%_Ilo}gelMZ%iighr?z3G@iL_NbQWUzecH-dXKqdWB@ z>`XI&JV^RlJ}9cE>=WgS3VFY!tT+9NH36okR7|N@EA$QXS%NE}C+%lm_xbuzfDV$^ zT+*q(WoNpNYj!da{m$P$c7TYy`s|>1?u9ISfPnc~g8RGdFRj~>Lp>#Xko(% z$ZftGX!ZP;D#vg2b1Hz%+u6k0Pq1IPD@Do9 z>Hl}m>EBb}qP7JSM(1>iA7+RQo+PwzsRzP$&hMzVms&N7{vPPJoZLN z+q7+a+&|_L82=FamwfyKI}~)0^d)pf!@}sngrPsX&hq@t97k!^u2(4p$w9ZVJ@5X|VaW$x zPLU?cy1bvejnR5K>o+p>Ikm^VC*x>Gpb9+KHDMj%lsO9b0gw!%qG2mny&8ffKz4mka9G)4o9G4rB%7UZOtg3%C+G?t17DSP zXxic~N(NvNJ5LowjE;}=dK4WN43G5o>lh|aTX*DRbJdyqsbq;R>WO5jVr*D7lCha+ z9{08&F{u$CV#tmB-@#lj^$lTj07JNZo{RD&Br$JCU^#ayvxl|9EcRR!e&}jwIMRj0al3*w(h2@F z-4~r&WR8_(N)hhZn=ZX&9qb^RBq55@K9E&Pk(IGikm$X+jNNG@QBUSOMhjdskzge} zyr0PnToV!=UD=ECTb;j+i#4oPOG$UxCH&-qJOU+*q7ui-`ZDNfU_hpL3BdEe*H!xd z=!vSwOVyDlp8Kl9w}k{e6&AX@-($2=^`ntHyxMUEP4|+<-jutQwI;`g?r7C>%HGAb z+=~jI9LBzAbo4nB>5z-{??AY+90H>TZ>h4`Zq#xm&Riz`u4aCTk;MrrM|*vCV)Whd zA;@{#>5;@2*#USCOAV6Lv?114eY?P;V4C1x_w4>GcnmYXWy;lPm=Dm23KZJVFO@>+ zQDqUWhCV`pcUd^xC?vt~tWZNFru{WzhOUM!ApqDGrNjo~-+DE&UkLQ8AOL&VzIHr1A=17XTMol=y;2&Eovl1bxB_^3_DWS6n2SlizW+TZ#=s z5T8{INg?W-5~!wEuqN2h9{td}!{j|o`GrQY<2xyBDW``P{L)dWIAQ{-dxI!rLa((_k?v5Gv?l}|2v_Z3 zSQ(F4^iu)?2tB@=!qG>sIz<|e2*yBxQ}}v73T73=N(sN>b$TINi8kmN?O;Dd^`z%L zkh}n8YGCe2BNiakK2DEj0~~5q4W&Rf+vrgiZ1iNjpM<+wBj$y>eA&v0SRXhhl(`f} z5x8+dcMBXdG*lsq2GeVUY=x)TaY}F6CoB#>*~=Q3%UC@&a`jI?56Q5#nlS1k6vyx= zgC=R-A1CJ0s$IcfiLt`2 zLOF3iA>o5zdYUd?1M0>nJD`l^lp~t3$Lo}o;)QRmDi&pv@kbpgSrtRUj>WLsE? zV?Sp-GAzuE97yKVcTCpwO0gRcUv<>!$@l8A*j%EJwodoQJvS>m$nvR4Wl&3mA42U( z%!OP5oO;_%3=OEOgsLX4LjHIw?21Ikdd;B{+xp;d*8{NkG}i}QSz?s%GwO!UwtfJx zyi+?(!t!OmL1YmsC&7NU*R;b3i6dREA2q|&*Dpvsc#1xB3Gr4@c)`|=HxWnM?+dU- z+bhOS4%c|OgjFY&bHNnFflnyjjS*mim7f>92)!~MWT00vws9L}0ak2qa+TH7wTBs!*af<3qk)OmpfI_-#oyv$liK)cLV3;mf zl>_l*HVM7hk+a=X9)UgGt(8{ks;r}XKw8ob8VT<8>@gH^UJ&AOBho82ykUMNEt$)F zW}{866l+qP3Idntx`$wyT*!sHC!)xl>b|=>sORnrMlMK(TQTeUrPJW@ zsYN=dbM?7T?wxWCAexlwMU1VaTupNhQHlriw;tcg))@P!Vvwv$6(LSZQf$b~0d=Ve zQNrHwFi!{Za&V@K|zAJ&N=`9bed`l-tkPNCQ6D=r*CFT!=*aN)zEtfhd>Dxq z=-5Hct>^V2D)YcF3CXROwC>W}D5w+K1Z$=x9P^Q6vP=`u#-S=|31%aOm=wvasOT$z zk^uM%tZ`~E0Kio1kNy&Fn`%${Kfj<*PF?({qx2%^mom61=H+=#ztL2^-Gdj#e6|ZM z>6QJFyRq1{pyEF3)4OB(D&w~AJ=wN<$?1K87x)EN zln)HXW)&ptdFCAMcB4#UU2`#tCytukGKdU8hADw<)4ME((F31z3*~kc&_Wxw z$~`Lug$3K?+X_B)^W;1TN=7v^ftCWFc`M|hUGVWZC%4+ZKLn8AJ5B!keA0R?kwD2H z7Ne6zBRzAM+!Va9`e}-_3RYyzG7Z@+Id-w>w3cNSH0m(TgM&MfH>8lnEIKlbxE4~8 z?w$Vm>OzB^KdC>mo954rTj%I!o-LVX(qFa{^;V$@VAGuXY@YgqbMxOWpJvyeGtb^| zs&$^`S-lmgtBVW{$4_(rALr)p-#W*4`Usr9>}0!}c*N*`{m)(}5AdU{aM3ITB7r={ zcXk~ke_CcQdY(FC;KM1)keIfXu2U5)bIH_!j|2If9tcX{v@RR2EY>x6%6^BM)WfT6 zjh$ZQowp~6#JQKAbcIwdQ7lW`TF*aOp@U$1BEkpvKFqwQyLP)lln4FX{OOn9lJ~~x z+V)G-{v^_E<@~W_L#{;4^Azsg2Yn@)2J3UEgJJCxEVZrme|{oJvk%c6&WUTP-u22n zeI4b_`Af+w>~cz+UU&0d?dPdaQ^U_WKJ#e*%{?XjEGHAyrCA5GjJ)(w#kx1sm!YO# zt-#yp{3VGg^7&5}Eufz+2S=}sy(HOnWe%^}Y;Wu(>E?Q~{17b%&gCUFvd!}@uh_-g zXQ+?Zaewq(4&!&Mel^8u+0<@5&IYR#*N!I1GAL>ncFgYEjH+7ni-4Hrv~Ru>U5k*e zzgtkdavsaE|NSMpz5cIPY$Kaa1o%s(Ux?*QT$^?_{3#^Pd5tGIb_|R|vX|`m-?r92 zjLKwC5GwBchjn7Tpfa5bipyp9H17?!r0ZpmI6cEf&)fbmRwej~Z^zEiaxYP|5pJNE zhe$cPhZz0{>9(obz%Qi9L*PSP8N?z*MQSh7bvt$t@$*X55{)T=%G5(eM}*(&-l&|J z;;LV=W2;@jqGj9v&b&7%eA?w(6_@OKP~gRdHti7D|)-hz~|6F zarRB8*Ad5zFY`$x{kTh!3w9#uNw+qt>LjWVY>5k|Wc86|XJvJg^>_tb&v7n&VnIY% zHb)}Mq8v1ey~MLtfTV480~``=k%7<579S-NZ3fG-OKZ0Ls;k&K62mqvUSg0u6x(tC z^sv-vgq52(&ZjRhn7+KV7`DwW2i}L!YE<3E>VGvc5XSf57x5@N!1Ei|vEQ(Q@Y)(R zOARcA!v`aN5wv2tXBRL3LVq8k=G+S*8LXua+b2mIR;DYd_jvF(&F;1FHbU*GdFXKL znJglYLExPnO?@qva^k2_4ycgqC{sLl!hDeOyzOIp+R&lQty8D`^j=?6RLEbmLieuP ztV}XS%QpS2MHyB;m*-=I3UPm@L>=2XYRWNlgIbm%i8d+c;@*|$%-pKuZGjqJZR>Fq z7bIDWiq8L8?aI1Z&p<%CYO(uTLdEl=^#nbB{s~kI4*8q2i;8jm0oYc%;Dz!nDNvDZ zB_6q*ylqb5zfo@dj|izf$Q$QT-W0>vYFWz;wi)wQP9K|u8;UKj^tmakcF*?dyYX4V q{>zp39@w<`pdj5cVP literal 0 HcmV?d00001 diff --git a/assets/images/tutorials/aspnet/new-asp-project-template.png b/assets/images/tutorials/aspnet/new-asp-project-template.png deleted file mode 100644 index 80c5e6dd08add0cb03c5e2136e2ce68fd4bbb270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31632 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 nUs=C^K*$*%1hQxPVjLSCV3ahEOtw diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index b1e1c4a02..a2d30aab8 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -1,11 +1,8 @@ # Setup -> Note: Updates for Visual Studio 2017 and the latest version of ASP.NET coming soon! - ## Install ASP.NET Core and TypeScript -First, [install ASP.NET Core](https://get.asp.net) if you need it. -This quick-start guide uses Visual Studio, which means that you'll need Visual Studio 2015 in order to use ASP.NET Core. +First, [install ASP.NET Core](https://get.asp.net) if you need it. This quick-start guide requires Visual Studio 2015 or 2017. Next, if your version of Visual Studio does not already have the latest TypeScript, you can [install it](http://www.microsoft.com/en-us/download/details.aspx?id=48593). @@ -14,19 +11,20 @@ Next, if your version of Visual Studio does not already have the latest TypeScri 1. Choose **File** 2. Choose **New Project** (Ctrl + Shift + N) 3. Choose **Visual C#** -4. Choose **ASP.NET Web Application** +4. For VS2015, choose **ASP.NET Web Application** > **ASP.NET 5 Empty**, and let's uncheck "Host in the cloud" since we're going to run this locally. - ![Create new ASP.NET project](../../assets/images/tutorials/aspnet/new-asp-project.png) + ![Use empty template](../../assets/images/tutorials/aspnet/new-asp-project-empty.png) -5. Choose **ASP.NET 5 Empty** + For VS2017, choose **ASP.NET Core Web Application (.NET Core)** > **ASP.NET Core 1.1 Empty** instead. - Let's uncheck "Host in the cloud" since we're going to run this locally. - ![Use empty template](../../assets/images/tutorials/aspnet/new-asp-project-empty.png) + ![Use empty template VS2017](../../assets/images/tutorials/aspnet/new-asp-project-empty-17.PNG) Run the application and make sure that it works. ## Set up the server +### VS2015 + In `project.json` add another entry in `"dependencies"`: ```json @@ -54,6 +52,24 @@ public void Configure(IApplicationBuilder app) } ``` +### VS2017 + +Open **Dependencies** > **Manage NuGet Packages** > **Browse**. Search and install `Microsoft.AspNetCore.StaticFiles` 1.1.2: + +![Install Microsoft.AspNetCore.StaticFiles](../../assets/images/tutorials/aspnet/install-nuget-packages.png) + +Replace the body of `Configure` in `Startup.cs` with + +```cs +public void Configure(IApplicationBuilder app) +{ + app.UseDefaultFiles(); + app.UseStaticFiles(); +} +``` + +You may need to restart VS for the red squiggly lines below `UseDefaultFiles` and `UseStaticFiles` to disappear. + # Add TypeScript The next step is to add a folder for TypeScript. @@ -205,7 +221,7 @@ Use the following code for `index.html`: ## Debug 1. In Edge, press F12 and click the **Debugger** tab. -2. Look in the first localhost folder, then src/app.ts +2. Look in the first localhost folder, then scripts/app.ts 3. Put a breakpoint on the line with `return`. 4. Type in the boxes and confirm that the breakpoint hits in TypeScript code and that inspection works correctly. @@ -218,12 +234,30 @@ Next we'll include Angular and write a simple Angular app. ## Add NPM dependencies -Add the following `"dependencies"` to `package.json` to install Angular 2 and SystemJS: +Add Angular 2 and SystemJS to `dependencies` in `package.json`. + +For VS2015, the new `dependencies` list: ```json "dependencies": { "angular2": "2.0.0-beta.11", "systemjs": "0.19.24", + "gulp": "3.9.0", + "del": "2.2.0" + }, +``` + +For VS2017, due to the deprecation of peer dependencies in NPM3, we need to list Angular 2's peer dependencies directly as dependencies as well: + +```json + "dependencies": { + "angular2": "2.0.0-beta.11", + "reflect-metadata": "0.1.2", + "rxjs": "5.0.0-beta.2", + "zone.js": "^0.6.4", + "systemjs": "0.19.24", + "gulp": "3.9.0", + "del": "2.2.0" }, ``` @@ -254,7 +288,7 @@ Our tsconfig should now look like this: "files": [ "./app.ts", "./model.ts", - "./main.ts", + "./main.ts" ], "compileOnSave": true } @@ -290,7 +324,7 @@ var paths = { }; gulp.task('lib', function () { - gulp.src(paths.libs).pipe(gulp.dest('wwwroot/scripts/lib')) + gulp.src(paths.libs).pipe(gulp.dest('wwwroot/scripts/lib')); }); gulp.task('clean', function () { @@ -298,7 +332,7 @@ gulp.task('clean', function () { }); gulp.task('default', ['lib'], function () { - gulp.src(paths.scripts).pipe(gulp.dest('wwwroot/scripts')) + gulp.src(paths.scripts).pipe(gulp.dest('wwwroot/scripts')); }); ``` @@ -324,7 +358,7 @@ export class MyApp { } ``` -Then add another TypeScript file in `src` named `model.ts`: +Then add another TypeScript file in `scripts` named `model.ts`: ```ts export class MyModel { @@ -332,7 +366,7 @@ export class MyModel { } ``` -And then another TypeScript file in `src` named `main.ts`: +And then another TypeScript file in `scripts` named `main.ts`: ```ts import {bootstrap} from "angular2/platform/browser"; From de05c09c3c2dfea19dee753e8d0de60777bf46de Mon Sep 17 00:00:00 2001 From: Tim Welch Date: Thu, 11 May 2017 18:33:42 -0500 Subject: [PATCH 333/831] Update Decorators.md --- pages/Decorators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Decorators.md b/pages/Decorators.md index 247c2d284..e800a4624 100644 --- a/pages/Decorators.md +++ b/pages/Decorators.md @@ -163,7 +163,7 @@ function sealed(constructor: Function) { When `@sealed` is executed, it will seal both the constructor and its prototype. -Next we have a example how to override the constructor. +Next we have an example of how to override the constructor. ```ts function classDecorator(constructor:T) { From 834d9611a67373a2cb8cdb7976bafb07ddc7d86b Mon Sep 17 00:00:00 2001 From: Limin Zhu Date: Fri, 12 May 2017 10:45:31 -0700 Subject: [PATCH 334/831] Add raw tag to escape liquid parsing --- pages/tutorials/ASP.NET Core.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pages/tutorials/ASP.NET Core.md b/pages/tutorials/ASP.NET Core.md index a2d30aab8..0dc20691f 100644 --- a/pages/tutorials/ASP.NET Core.md +++ b/pages/tutorials/ASP.NET Core.md @@ -342,6 +342,8 @@ Again, make sure that Task Runner Explorer sees the new `lib` task after you sav First, change the code in `app.ts` to: +{% raw %} + ```ts import {Component} from "angular2/core" import {MyModel} from "./model" @@ -358,6 +360,8 @@ export class MyApp { } ``` +{% endraw %} + Then add another TypeScript file in `scripts` named `model.ts`: ```ts From d543dfec891f02028761e8cac3ee8655bb6819a7 Mon Sep 17 00:00:00 2001 From: vomvoru Date: Sat, 13 May 2017 21:17:50 +0900 Subject: [PATCH 335/831] fixed Best common type references : https://github.com/Microsoft/TypeScript/issues/805 --- pages/Type Inference.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pages/Type Inference.md b/pages/Type Inference.md index 63e790b41..4b9bbbdf6 100644 --- a/pages/Type Inference.md +++ b/pages/Type Inference.md @@ -41,9 +41,7 @@ To correct this, instead explicitly provide the type when no one type is a super let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()]; ``` -When no best common type is found, the resulting inference is the empty object type, `{}`. -Because this type has no members, attempting to use any properties of it will cause an error. -This result allows you to still use the object in a type-agnostic manner, while providing type safety in cases where the type of the object can't be implicitly determined. +When no best common type is found, the resulting inference is the union array type, `(Rhino | Elephant | Snake)[]`. # Contextual Type From baf0af88b2200ca9d78266b5c220a5440e3216c8 Mon Sep 17 00:00:00 2001 From: phi161 Date: Wed, 17 May 2017 15:48:05 +0300 Subject: [PATCH 336/831] Fix a broken link to the atom-typescript section about the "compileOnSave" feature --- pages/tsconfig.json.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tsconfig.json.md b/pages/tsconfig.json.md index 272d0b2be..25f816d1d 100644 --- a/pages/tsconfig.json.md +++ b/pages/tsconfig.json.md @@ -199,7 +199,7 @@ Setting a top-level property `compileOnSave` signals to the IDE to generate all } ``` -This feature is currently supported in Visual Studio 2015 with TypeScript 1.8.4 and above, and [atom-typescript](https://github.com/TypeStrong/atom-typescript/blob/master/docs/tsconfig.md#compileonsave) plugin. +This feature is currently supported in Visual Studio 2015 with TypeScript 1.8.4 and above, and [atom-typescript](https://github.com/TypeStrong/atom-typescript#compile-on-save) plugin. ## Schema From b2745970f64c897cddc0c956cc1e343b24937024 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Fri, 19 May 2017 02:13:43 -0700 Subject: [PATCH 337/831] Adding SFC, children type checkin --- pages/JSX.md | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) diff --git a/pages/JSX.md b/pages/JSX.md index 638b991dd..2ac897e30 100644 --- a/pages/JSX.md +++ b/pages/JSX.md @@ -102,7 +102,55 @@ import MyComponent from "./myComponent"; ; // error ``` -It is possible to limit the type of a value-based element. +There are two ways to define a value-based element: + +1. Stateless Functional Component (SFC) +2. Class Component + +Because these two types of value-based elements are indistinguishable from each other in JSX expression, we first try to resolve the expression as Stateless Functional Component using overload resolution. If the process successes, then we are done resolving the expression to its declaration. If we fail to resolve as SFC, we will then try to resolve as a class component. If that fails, we will report an error. + +### Stateless Functional Component +As the name suggested, the component is defined as JavaScript function where its first argument is a `props` object. +We enforce that its return type must be assignable to `JSX.Element` + +```ts +interface FooProp { + name: string; + X: number; + Y: number; +} + +declare function AnotherComponent(prop: {name: string}); +function ComponentFoo(prop: FooProp) { + return ; +} + +const Button = (prop: {value: string}, context: { color: string }) =>
; +``` +emits as +```ts +const preact = require("preact"); +const x = preact.h("div", null); +``` + +The factory chosen will also affect where the `JSX` namespace is looked up (for type checking information) before falling back to the global one. If the factory is defined as `React.createElement` (the default), the compiler will check for `React.JSX` before checking for a global `JSX`. If the factory is defined as `h`, it will check for `h.JSX` before a global `JSX`. From a00ee73b8a924a0f585692adae06de598eb9681d Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 3 May 2018 08:56:49 -0700 Subject: [PATCH 480/831] Fix https://github.com/Microsoft/TypeScript-Handbook/issues/760 Use `%20` instead of `-` for spaces in url --- pages/Compiler Options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index ad67f11b4..8f98c7170 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -89,4 +89,4 @@ Option | Type | Default ## Related * Setting compiler options in [`tsconfig.json`](./tsconfig.json.md) files. -* Setting compiler options in [MSBuild projects](./Compiler-Options-in-MSBuild.md). +* Setting compiler options in [MSBuild projects](./Compiler%20Options%20in%20MSBuild.md). From fa98df818c7cb74c13a7d2a0a66ebcece57efedc Mon Sep 17 00:00:00 2001 From: John Hill Date: Mon, 7 May 2018 13:12:04 -0700 Subject: [PATCH 481/831] fix typo in 'unique symbol' block of TypeScript 2.7 release notes --- pages/release notes/TypeScript 2.7.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/release notes/TypeScript 2.7.md b/pages/release notes/TypeScript 2.7.md index 173035485..1ef6ccb20 100644 --- a/pages/release notes/TypeScript 2.7.md +++ b/pages/release notes/TypeScript 2.7.md @@ -45,7 +45,7 @@ let b = x[Bar]; // has type 'string' ## `unique symbol` To enable treating symbols as unique literals a new type `unique symbol` is available. -`unique symbol` is are subtype of `symbol`, and are produced only from calling `Symbol()` or `Symbol.for()`, or from explicit type annotations. +`unique symbol` is a subtype of `symbol`, and are produced only from calling `Symbol()` or `Symbol.for()`, or from explicit type annotations. The new type is only allowed on `const` declarations and `readonly static` properties, and in order to reference a specific unique symbol, you'll have to use the `typeof` operator. Each reference to a `unique symbol` implies a completely unique identity that's tied to a given declaration. From cbfa0ca5f3573f53a2e365d91650678efb8d78cd Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 8 May 2018 10:03:26 -0700 Subject: [PATCH 482/831] Fix lint failures --- pages/JSX.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pages/JSX.md b/pages/JSX.md index d38608fe3..990871fac 100644 --- a/pages/JSX.md +++ b/pages/JSX.md @@ -411,12 +411,15 @@ class MyComponent extends React.Component { The exact factory function used by the `jsx: react` compiler option is configurable. It may be set using either the `jsxFactory` command line option, or an inline `@jsx` comment pragma to set it on a per-file basis. For example, if you set `jsxFactory` to `createElement`, `
` will emit as `createElement("div")` instead of `React.createElement("div")`. The comment pragma version may be used like so (in TypeScript 2.8): + ```ts import preact = require("preact"); /* @jsx preact.h */ const x =
; ``` -emits as + +emits as: + ```ts const preact = require("preact"); const x = preact.h("div", null); From 60c9fb392abe1f9bac22f2de9405488476bc82ef Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Tue, 8 May 2018 10:10:30 -0700 Subject: [PATCH 483/831] Add docs for --keyofStringsOnly`, `--declarationMap` and `--resolveJsonModule` Addresses https://github.com/Microsoft/TypeScript/issues/23627 --- pages/Compiler Options.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index 8f98c7170..da19129eb 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -12,6 +12,7 @@ Option | Type | Default `--checkJs` | `boolean` | `false` | Report errors in `.js` files. Use in conjunction with `--allowJs`. `--declaration`
`-d` | `boolean` | `false` | Generates corresponding `.d.ts` file. `--declarationDir` | `string` | | Output directory for generated declaration files. +`--declarationMap` | `boolean` | `false` | Generates a sourcemap for each corresponding '.d.ts' file. `--diagnostics` | `boolean` | `false` | Show diagnostic information. `--disableSizeLimit` | `boolean` | `false` | Disable size limitation on JavaScript project. `--downlevelIteration` | `boolean` | `false` | Provide full support for iterables in `for..of`, spread and destructuring when targeting ES5 or ES3. @@ -29,6 +30,7 @@ Option | Type | Default `--isolatedModules` | `boolean` | `false` | Transpile each file as a separate module (similar to "ts.transpileModule"). `--jsx` | `string` | `"Preserve"` | Support JSX in `.tsx` files: `"React"` or `"Preserve"`. See [JSX](./JSX.md). `--jsxFactory` | `string` | `"React.createElement"` | Specify the JSX factory function to use when targeting react JSX emit, e.g. `React.createElement` or `h`. +`--keyofStringsOnly` | `boolean` | `false` | Resolve `keyof` to string valued property names only (no numbers or symbols). `--lib` | `string[]`| | List of library files to be included in the compilation.
Possible values are:
► `ES5`
► `ES6`
► `ES2015`
► `ES7`
► `ES2016`
► `ES2017`
► `ES2018`
► `ESNext`
► `DOM`
► `DOM.Iterable`
► `WebWorker`
► `ScriptHost`
► `ES2015.Core`
► `ES2015.Collection`
► `ES2015.Generator`
► `ES2015.Iterable`
► `ES2015.Promise`
► `ES2015.Proxy`
► `ES2015.Reflect`
► `ES2015.Symbol`
► `ES2015.Symbol.WellKnown`
► `ES2016.Array.Include`
► `ES2017.object`
► `ES2017.Intl`
► `ES2017.SharedMemory`
► `ES2017.TypedArrays`
► `ES2018.Intl`
► `ES2018.Promise`
► `ES2018.RegExp`
► `ESNext.AsyncIterable`
► `ESNext.Array`

Note: If `--lib` is not specified a default list of librares are injected. The default libraries injected are:
► For `--target ES5`: `DOM,ES5,ScriptHost`
► For `--target ES6`: `DOM,ES6,DOM.Iterable,ScriptHost` `--listEmittedFiles` | `boolean` | `false` | Print names of generated files part of the compilation. `--listFiles` | `boolean` | `false` | Print names of files part of the compilation. @@ -63,6 +65,7 @@ Option | Type | Default `--project`
`-p` | `string` | | Compile a project given a valid configuration file.
The argument can be a file path to a valid JSON configuration file, or a directory path to a directory containing a `tsconfig.json` file.
See [tsconfig.json](./tsconfig.json.md) documentation for more details. `--reactNamespace` | `string` | `"React"` | DEPRECATED. Use `--jsxFactory` instead.
Specifies the object invoked for `createElement` and `__spread` when targeting `"react"` JSX emit. `--removeComments` | `boolean` | `false` | Remove all comments except copy-right header comments beginning with `/*!` +`--resolveJsonModule` | `boolean` | `false` | Include modules imported with `.json` extension. `--rootDir` | `string` | *(common root directory is computed from the list of input files)* | Specifies the root directory of input files. Only use to control the output directory structure with `--outDir`. `rootDirs`[2] | `string[]`| | List of root folders whose combined content represent the structure of the project at runtime. See [Module Resolution documentation](./Module Resolution.md#virtual-directories-with-rootdirs) for more details. `--skipDefaultLibCheck` | `boolean` | `false` | DEPRECATED. Use `--skipLibCheck` instead.
Skip type checking of [default library declaration files](./Triple-Slash Directives.md#-reference-no-default-libtrue). From bbd397fe0415e163053ffb2f2542f7fa751d438d Mon Sep 17 00:00:00 2001 From: William Sun Date: Wed, 23 May 2018 10:43:13 -0700 Subject: [PATCH 484/831] Fix typo --- pages/tutorials/Migrating from JavaScript.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/Migrating from JavaScript.md b/pages/tutorials/Migrating from JavaScript.md index 7c72119db..c8d66dea5 100644 --- a/pages/tutorials/Migrating from JavaScript.md +++ b/pages/tutorials/Migrating from JavaScript.md @@ -9,7 +9,7 @@ If you're looking to convert a React project, we recommend looking at the [React # Setting up your Directories If you're writing in plain JavaScript, it's likely that you're running your JavaScript directly, - where your `.js` files in a `src`, `lib`, or `dist` directory, and then ran as desired. + where your `.js` files are in a `src`, `lib`, or `dist` directory, and then ran as desired. If that's the case, the files that you've written are going to be used as inputs to TypeScript, and you'll run the outputs it produces. During our JS to TS migration, we'll need to separate our input files to prevent TypeScript from overwriting them. From fd368d70c6193e66b2de54cb8c57c0c7a91db616 Mon Sep 17 00:00:00 2001 From: Matthias Bertram Date: Mon, 28 May 2018 09:16:39 +0200 Subject: [PATCH 485/831] Update the React & Webpack tutorial - Use the default configuration values of Webpack 4 - Switch to ts-loader after experiencing performance degradation with awesome-typescript-loader - Install Webpack as a local package - Move @types into devDependencies --- pages/tutorials/React & Webpack.md | 67 +++++++++++++++--------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 140d437ee..a57030036 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -23,16 +23,13 @@ proj/ └─ components/ ``` -TypeScript files will start out in your `src` folder, run through the TypeScript compiler, then webpack, and end up in a `bundle.js` file in `dist`. +TypeScript files will start out in your `src` folder, run through the TypeScript compiler, then webpack, and end up in a `main.js` file in `dist`. Any components that we write will go in the `src/components` folder. Let's scaffold this out: ```shell -mkdir src -cd src -mkdir components -cd .. +mkdir -p src/components ``` Webpack will eventually generate the `dist` directory for us. @@ -42,18 +39,17 @@ Webpack will eventually generate the `dist` directory for us. Now we'll turn this folder into an npm package. ```shell -npm init +npm init -y ``` -You'll be given a series of prompts, but you can feel free to use the defaults. -You can always go back and change these in the `package.json` file that's been generated for you. +This creates a `package.json` file with default values. # Install our dependencies -First ensure Webpack is installed globally. +First ensure Webpack is installed. ```shell -npm install -g webpack +npm install --save-dev webpack webpack-cli ``` Webpack is a tool that will bundle your code and optionally all of its dependencies into a single `.js` file. @@ -61,7 +57,8 @@ Webpack is a tool that will bundle your code and optionally all of its dependenc Let's now add React and React-DOM, along with their declaration files, as dependencies to your `package.json` file: ```shell -npm install --save react react-dom @types/react @types/react-dom +npm install --save react react-dom +npm install --save-dev @types/react @types/react-dom ``` That `@types/` prefix means that we also want to get the declaration files for React and React-DOM. @@ -69,20 +66,21 @@ Usually when you import a path like `"react"`, it will look inside of the `react however, not all packages include declaration files, so TypeScript also looks in the `@types/react` package as well. You'll see that we won't even have to think about this later on. -Next, we'll add development-time dependencies on [awesome-typescript-loader](https://www.npmjs.com/package/awesome-typescript-loader) and [source-map-loader](https://www.npmjs.com/package/source-map-loader). +Next, we'll add development-time dependencies on the [ts-loader](https://www.npmjs.com/package/ts-loader) and [source-map-loader](https://www.npmjs.com/package/source-map-loader). ```shell -npm install --save-dev typescript awesome-typescript-loader source-map-loader +npm install --save-dev typescript ts-loader source-map-loader ``` Both of these dependencies will let TypeScript and webpack play well together. -awesome-typescript-loader helps Webpack compile your TypeScript code using the TypeScript's standard configuration file named `tsconfig.json`. +ts-loader helps Webpack compile your TypeScript code using the TypeScript's standard configuration file named `tsconfig.json`. source-map-loader uses any sourcemap outputs from TypeScript to inform webpack when generating *its own* sourcemaps. This will allow you to debug your final output file as if you were debugging your original TypeScript source code. -Please note that awesome-typescript-loader is not the only loader for typescript. -You could instead use [ts-loader](https://github.com/TypeStrong/ts-loader). -Read about the differences between them [here](https://github.com/s-panferov/awesome-typescript-loader#differences-between-ts-loader) +Please note that ts-loader is not the only loader for typescript. +You could instead use [awesome-typescript-loader](https://www.npmjs.com/package/awesome-typescript-loader). + +Read about the differences between them [here](https://github.com/s-panferov/awesome-typescript-loader#differences-between-ts-loader). Notice that we installed TypeScript as a development dependency. We could also have linked TypeScript to a global copy with `npm link typescript`, but this is a less common scenario. @@ -103,10 +101,7 @@ Simply create a new file in your project root named `tsconfig.json` and fill it "module": "commonjs", "target": "es5", "jsx": "react" - }, - "include": [ - "./src/**/*" - ] + } } ``` @@ -177,7 +172,7 @@ Create a file at the root of `proj` named `index.html` with the following conten - + ``` @@ -193,27 +188,33 @@ Create a `webpack.config.js` file at the root of the project directory. ```js module.exports = { - entry: "./src/index.tsx", - output: { - filename: "bundle.js", - path: __dirname + "/dist" - }, + mode: "production", // Enable sourcemaps for debugging webpack's output. devtool: "source-map", resolve: { // Add '.ts' and '.tsx' as resolvable extensions. - extensions: [".ts", ".tsx", ".js", ".json"] + extensions: [".ts", ".tsx"] }, module: { rules: [ - // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. - { test: /\.tsx?$/, loader: "awesome-typescript-loader" }, - + { + test: /\.ts(x?)$/, + exclude: /node_modules/, + use: [ + { + loader: "ts-loader" + } + ] + }, // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. - { enforce: "pre", test: /\.js$/, loader: "source-map-loader" } + { + enforce: "pre", + test: /\.js$/, + loader: "source-map-loader" + } ] }, @@ -243,7 +244,7 @@ You can learn more about configuring webpack [here](https://webpack.js.org/conce Just run: ```shell -webpack +npx webpack ``` Now open up `index.html` in your favorite browser and everything should be ready to use! From f87fcfc7854dd478667e6bb6fa46309c10e0e6dc Mon Sep 17 00:00:00 2001 From: Nico Sommi Date: Mon, 28 May 2018 18:15:28 -0300 Subject: [PATCH 486/831] Fix case and adds react-native option to jsx argument --- pages/Compiler Options in MSBuild.md | 2 +- pages/Compiler Options.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/Compiler Options in MSBuild.md b/pages/Compiler Options in MSBuild.md index d67ec6e10..bb9cc2b6b 100644 --- a/pages/Compiler Options in MSBuild.md +++ b/pages/Compiler Options in MSBuild.md @@ -46,7 +46,7 @@ Compiler Option | MSBuild Property Name `--inlineSources` | TypeScriptInlineSources | boolean `--init` | *Not supported in MSBuild* | `--isolatedModules` | TypeScriptIsolatedModules | boolean -`--jsx` | TypeScriptJSXEmit | `React` or `Preserve` +`--jsx` | TypeScriptJSXEmit | `react`, `react-native`, `preserve` `--jsxFactory` | TypeScriptJSXFactory | qualified name `--lib` | TypeScriptLib | Comma-separated list of strings `--listEmittedFiles` | *Not supported in MSBuild* | diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index da19129eb..bb38421ea 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -28,7 +28,7 @@ Option | Type | Default `--inlineSources` | `boolean` | `false` | Emit the source alongside the sourcemaps within a single file; requires `--inlineSourceMap` or `--sourceMap` to be set. `--init` | | | Initializes a TypeScript project and creates a `tsconfig.json` file. `--isolatedModules` | `boolean` | `false` | Transpile each file as a separate module (similar to "ts.transpileModule"). -`--jsx` | `string` | `"Preserve"` | Support JSX in `.tsx` files: `"React"` or `"Preserve"`. See [JSX](./JSX.md). +`--jsx` | `string` | `"preserve"` | Support JSX in `.tsx` files: `"react"`, `"preserve"`, `"react-native"`. See [JSX](./JSX.md). `--jsxFactory` | `string` | `"React.createElement"` | Specify the JSX factory function to use when targeting react JSX emit, e.g. `React.createElement` or `h`. `--keyofStringsOnly` | `boolean` | `false` | Resolve `keyof` to string valued property names only (no numbers or symbols). `--lib` | `string[]`| | List of library files to be included in the compilation.
Possible values are:
► `ES5`
► `ES6`
► `ES2015`
► `ES7`
► `ES2016`
► `ES2017`
► `ES2018`
► `ESNext`
► `DOM`
► `DOM.Iterable`
► `WebWorker`
► `ScriptHost`
► `ES2015.Core`
► `ES2015.Collection`
► `ES2015.Generator`
► `ES2015.Iterable`
► `ES2015.Promise`
► `ES2015.Proxy`
► `ES2015.Reflect`
► `ES2015.Symbol`
► `ES2015.Symbol.WellKnown`
► `ES2016.Array.Include`
► `ES2017.object`
► `ES2017.Intl`
► `ES2017.SharedMemory`
► `ES2017.TypedArrays`
► `ES2018.Intl`
► `ES2018.Promise`
► `ES2018.RegExp`
► `ESNext.AsyncIterable`
► `ESNext.Array`

Note: If `--lib` is not specified a default list of librares are injected. The default libraries injected are:
► For `--target ES5`: `DOM,ES5,ScriptHost`
► For `--target ES6`: `DOM,ES6,DOM.Iterable,ScriptHost` From dd3e6027e33c06d46efe1db82cd79841ca5b908a Mon Sep 17 00:00:00 2001 From: iceRao Date: Wed, 30 May 2018 00:02:55 +0800 Subject: [PATCH 487/831] The target of TypeScript is es6 The target of TypeScript is es6. If target is es5,have error message "ERROR in [at-loader] ./node_modules/@types/node/index.d.ts" --- pages/tutorials/React & Webpack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/React & Webpack.md b/pages/tutorials/React & Webpack.md index 140d437ee..fbb6878a0 100644 --- a/pages/tutorials/React & Webpack.md +++ b/pages/tutorials/React & Webpack.md @@ -101,7 +101,7 @@ Simply create a new file in your project root named `tsconfig.json` and fill it "sourceMap": true, "noImplicitAny": true, "module": "commonjs", - "target": "es5", + "target": "es6", "jsx": "react" }, "include": [ From 284581b9d0ec1742a6e8c48860ed167ceefeca5e Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 30 May 2018 12:51:46 -0700 Subject: [PATCH 488/831] Add release notes for 2.9 --- pages/release notes/TypeScript 2.9.md | 316 ++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 pages/release notes/TypeScript 2.9.md diff --git a/pages/release notes/TypeScript 2.9.md b/pages/release notes/TypeScript 2.9.md new file mode 100644 index 000000000..3ad82544c --- /dev/null +++ b/pages/release notes/TypeScript 2.9.md @@ -0,0 +1,316 @@ +# Support `number` and `symbol` named properties with `keyof` and mapped types + +TypeScript 2.9 adds support for `number` and `symbol` named properties in index types and mapped types. +Previously, the `keyof` operator and mapped types only supported `string` named properties. + +Changes include: + +* An index type `keyof T` for some type `T` is a subtype of `string | number | symbol`. +* A mapped type `{ [P in K]: XXX }` permits any `K` assignable to `string | number | symbol`. +* In a `for...in` statement for an object of a generic type `T`, the inferred type of the iteration variable was previously `keyof T` but is now `Extract`. (In other words, the subset of `keyof T` that includes only string-like values.) + +Given an object type `X`, `keyof X` is resolved as follows: + +* If `X` contains a string index signature, `keyof X` is a union of `string`, `number`, and the literal types representing symbol-like properties, otherwise +* If `X` contains a numeric index signature, `keyof X` is a union of `number` and the literal types representing string-like and symbol-like properties, otherwise +* `keyof X` is a union of the literal types representing string-like, number-like, and symbol-like properties. + +Where: + +* String-like properties of an object type are those declared using an identifier, a string literal, or a computed property name of a string literal type. +* Number-like properties of an object type are those declared using a numeric literal or computed property name of a numeric literal type. +* Symbol-like properties of an object type are those declared using a computed property name of a unique symbol type. + +In a mapped type `{ [P in K]: XXX }`, each string literal type in `K` introduces a property with a string name, each numeric literal type in `K` introduces a property with a numeric name, and each unique symbol type in `K` introduces a property with a unique symbol name. +Furthermore, if `K` includes type `string`, a string index signature is introduced, and if `K` includes type `number`, a numeric index signature is introduced. + +##### Example + +```ts +const c = "c"; +const d = 10; +const e = Symbol(); + +const enum E1 { A, B, C } +const enum E2 { A = "A", B = "B", C = "C" } + +type Foo = { + a: string; // String-like name + 5: string; // Number-like name + [c]: string; // String-like name + [d]: string; // Number-like name + [e]: string; // Symbol-like name + [E1.A]: string; // Number-like name + [E2.A]: string; // String-like name +} + +type K1 = keyof Foo; // "a" | 5 | "c" | 10 | typeof e | E1.A | E2.A +type K2 = Extract; // "a" | "c" | E2.A +type K3 = Extract; // 5 | 10 | E1.A +type K4 = Extract; // typeof e +``` + +Since `keyof` now reflects the presence of a numeric index signature by including type `number` in the key type, mapped types such as `Partial` and `Readonly` work correctly when applied to object types with numeric index signatures: + +```ts +type Arrayish = { + length: number; + [x: number]: T; +} + +type ReadonlyArrayish = Readonly>; + +declare const map: ReadonlyArrayish; +let n = map.length; +let x = map[123]; // Previously of type any (or an error with --noImplicitAny) +``` + +Furthermore, with the `keyof` operator's support for `number` and `symbol` named keys, it is now possible to abstract over access to properties of objects that are indexed by numeric literals (such as numeric enum types) and unique symbols. + +```ts +const enum Enum { A, B, C } + +const enumToStringMap = { + [Enum.A]: "Name A", + [Enum.B]: "Name B", + [Enum.C]: "Name C" +} + +const sym1 = Symbol(); +const sym2 = Symbol(); +const sym3 = Symbol(); + +const symbolToNumberMap = { + [sym1]: 1, + [sym2]: 2, + [sym3]: 3 +}; + +type KE = keyof typeof enumToStringMap; // Enum (i.e. Enum.A | Enum.B | Enum.C) +type KS = keyof typeof symbolToNumberMap; // typeof sym1 | typeof sym2 | typeof sym3 + +function getValue(obj: T, key: K): T[K] { + return obj[key]; +} + +let x1 = getValue(enumToStringMap, Enum.C); // Returns "Name C" +let x2 = getValue(symbolToNumberMap, sym3); // Returns 3 +``` + +This is a breaking change; previously, the `keyof` operator and mapped types only supported `string` named properties. +Code that assumed values typed with `keyof T` were always `string`s, will now be flagged as error. + +##### Example + +```ts +function useKey(o: T, k: K) { + var name: string = k; // Error: keyof T is not assignable to string +} +``` + +#### Recommendations + +* If your functions are only able to handle string named property keys, use `Extract` in the declaration: + + ```ts + function useKey>(o: T, k: K) { + var name: string = k; // OK + } + ``` + +* If your functions are open to handling all property keys, then the changes should be done down-stream: + + ```ts + function useKey(o: T, k: K) { + var name: string | number | symbol = k; + } + ``` + +* Otherwise use `--keyofStringsOnly` compiler option to disable the new behavior. + +# Generic type arguments in JSX elements + +JSX elements now allow passing type arguments to generic components. + +##### Example + +```ts +class GenericComponent

extends React.Component

{ + internalProp: P; +} + +type Props = { a: number; b: string; }; + +const x = a={10} b="hi"/>; // OK + +const y = a={10} b={20} />; // Error +``` + +# Generic type arguments in generic tagged templates + +Tagged templates are a form of invocation introduced in ECMAScript 2015. +Like call expressions, generic functions may be used in a tagged template and TypeScript will infer the type arguments utilized. + +TypeScript 2.9 allows passing generic type arguments to tagged template strings. + +##### Example + +```ts +declare function styledComponent(strs: TemplateStringsArray): Component; + +interface MyProps { + name: string; + age: number; +} + +styledComponent ` + font-size: 1.5em; + text-align: center; + color: palevioletred; +`; + +declare function tag(strs: TemplateStringsArray, ...args: T[]): T; + +// inference fails because 'number' and 'string' are both candidates that conflict +let a = tag `${100} ${"hello"}`; +``` + +# `import` types + +Modules can import types declared in other modules. But non-module global scripts cannot access types declared in modules. Enter `import` types. + +Using `import("mod")` in a type annotation allows for reaching in a module and accessing its exported declaration without importing it. + +##### Example + +Given a declaration of a class `Pet` in a module file: + +```ts +// module.d.ts + +export declare class Pet { + name: string; +} +``` + +Can be used in a non-module file `global-script.ts`: + +```ts +// global-script.ts + +function adopt(p: import("./module").Pet) { + console.log(`Adopting ${p.name}...`); +} +``` + +This also works in JSDoc comments to refer to types from other modules in `.js`: + +```js +// a.js + +/** + * @param p { import("./module").Pet } + */ +function walk(p) { + console.log(`Walking ${p.name}...`); +} +``` + +# Relaxing declaration emit visiblity rules + +With `import` types available, many of the visibility errors reported during declaration file generation can be handled by the compiler without the need to change the input. + +For instance: + +```ts +import { createHash } from "crypto"; + +export const hash = createHash("sha256"); +// ^^^^ +// Exported variable 'hash' has or is using name 'Hash' from external module "crypto" but cannot be named. +``` + +With TypeScript 2.9, no errors are reported, and now the generated file looks like: + +```ts +export declare const hash: import("crypto").Hash; +``` + +# Support for `import.meta` + +TypeScript 2.9 introduces support for `import.meta`, a new meta-property as described by the current [TC39 proposal](https://github.com/tc39/proposal-import-meta). + +The type of `import.meta` is the global `ImportMeta` type which is defined in `lib.es5.d.ts`. +This interface is extremely limited. +Adding well-known properties for Node or browsers requires interface merging and possibly a global augmentation depending on the context. + +##### Example + +Assuming that `__dirname` is always available on `import.meta`, the declaration would be done through reopening `ImportMeta` interface: + +```ts +// node.d.ts +interface ImportMeta { + __dirname: string; +} +``` + +And usage would be: + +```ts +import.meta.__dirname // Has type 'string' +``` + +`import.meta` is only allowed when targeting `ESNext` modules and ECMAScript targets. + +# New `--resolveJsonModule` + +Often in Node.js applications a `.json` is needed. With TypeScript 2.9, `--resolveJsonModule` allows for importing, extracting types from and generating `.json` files. + +##### Example + +```ts +// settings.json + +{ + "repo": "TypeScript", + "dry": false, + "debug": false +} +``` + +```ts +// a.ts + +import settings from "./settings.json"; + +settings.debug === true; // OK +settings.dry === 2; // Error: Operator '===' cannot be applied boolean and number + +``` + +```ts +// tsconfig.json + +{ + "compilerOptions": { + "module": "commonjs", + "resolveJsonModule": true, + "esModuleInterop": true + } +} +``` + +# `--pretty` output by default + +Starting TypeScript 2.9 errors are displayed under `--pretty` by default if the output device is applicable for colorful text. +TypeScript will check if the output steam has [`isTty`](https://nodejs.org/api/tty.html) property set. + +Use `--pretty false` on the command line or set `"pretty": false` in your `tsconfig.json` to disable `--pretty` output. + +# New `--declarationMap` + +Enabling `--declarationMap` alongside `--declaration` causes the compiler to emit `.d.ts.map` files alongside the output `.d.ts` files. +Language Services can also now understand these map files, and uses them to map declaration-file based definition locations to their original source, when available. + +In other words, hitting go-to-definition on a declaration from a `.d.ts` file generated with `--declarationMap` will take you to the source file (`.ts`) location where that declaration was defined, and not to the `.d.ts`. From bbbc4f485ccf40f0e871991c46462ba1f9bdef4e Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Thu, 31 May 2018 07:35:16 +0400 Subject: [PATCH 489/831] Fix Type Compatibility typo and minor punctuation issues --- pages/Type Compatibility.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index 291146536..1ba5bfdb9 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -19,7 +19,7 @@ let p: Named; p = new Person(); ``` -In nominally-typed languages like C# or Java, the equivalent code would be an error because the `Person` class does not explicitly describe itself as being an implementor of the `Named` interface. +In nominally-typed languages like C# or Java, the equivalent code would be an error because the `Person` class does not explicitly describe itself as being an implementer of the `Named` interface. TypeScript's structural type system was designed based on how JavaScript code is typically written. Because JavaScript widely uses anonymous objects like function expressions and object literals, it's much more natural to represent the kinds of relationships found in JavaScript libraries with a structural type system instead of a nominal one. @@ -255,10 +255,11 @@ identity = reverse; // Okay because (x: any)=>any matches (y: any)=>any ## Subtype vs Assignment -So far, we've used 'compatible', which is not a term defined in the language spec. +So far, we've used "compatible", which is not a term defined in the language spec. In TypeScript, there are two kinds of compatibility: subtype and assignment. -These differ only in that assignment extends subtype compatibility with rules to allow assignment to and from `any` and to and from enum with corresponding numeric values. +These differ only in that assignment extends subtype compatibility with rules to allow assignment to and from `any`, and to and from `enum` with corresponding numeric values. Different places in the language use one of the two compatibility mechanisms, depending on the situation. -For practical purposes, type compatibility is dictated by assignment compatibility even in the cases of the `implements` and `extends` clauses. +For practical purposes, type compatibility is dictated by assignment compatibility, even in the cases of the `implements` and `extends` clauses. + For more information, see the [TypeScript spec](https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md). From d65308a9137fe2fef1e4e7617c0c2acd8ae267aa Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Thu, 31 May 2018 08:04:03 +0400 Subject: [PATCH 490/831] Fix Type Compatibility inconsistent comment style --- pages/Type Compatibility.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index 291146536..19863f29f 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -102,7 +102,7 @@ let x = () => ({name: "Alice"}); let y = () => ({name: "Alice", location: "Seattle"}); x = y; // OK -y = x; // Error because x() lacks a location property +y = x; // Error, because x() lacks a location property ``` The type system enforces that the source function's return type be a subtype of the target type's return type. @@ -172,7 +172,7 @@ enum Status { Ready, Waiting }; enum Color { Red, Blue, Green }; let status = Status.Ready; -status = Color.Green; //error +status = Color.Green; // Error ``` # Classes @@ -195,8 +195,8 @@ class Size { let a: Animal; let s: Size; -a = s; //OK -s = a; //OK +a = s; // OK +s = a; // OK ``` ## Private and protected members in classes @@ -216,7 +216,7 @@ interface Empty { let x: Empty; let y: Empty; -x = y; // okay, y matches structure of x +x = y; // OK, because y matches structure of x ``` In the above, `x` and `y` are compatible because their structures do not use the type argument in a differentiating way. @@ -229,7 +229,7 @@ interface NotEmpty { let x: NotEmpty; let y: NotEmpty; -x = y; // error, x and y are not compatible +x = y; // Error, because x and y are not compatible ``` In this way, a generic type that has its type arguments specified acts just like a non-generic type. @@ -248,7 +248,7 @@ let reverse = function(y: U): U { // ... } -identity = reverse; // Okay because (x: any)=>any matches (y: any)=>any +identity = reverse; // OK, because (x: any) => any matches (y: any) => any ``` # Advanced Topics From 75b80e798bede14aa99686715d31efcdeca0490b Mon Sep 17 00:00:00 2001 From: Omar Boukli-Hacene Date: Thu, 31 May 2018 08:37:29 +0400 Subject: [PATCH 491/831] Replace alert function with console.log where applicable Fix minor style issues --- pages/Basic Types.md | 4 ++-- pages/Declaration Merging.md | 4 ++-- pages/Generics.md | 2 +- pages/Type Checking JavaScript Files.md | 10 +++++----- pages/Type Compatibility.md | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pages/Basic Types.md b/pages/Basic Types.md index d74e07b21..de74ce8c7 100644 --- a/pages/Basic Types.md +++ b/pages/Basic Types.md @@ -135,7 +135,7 @@ For example, if we had the value `2` but weren't sure what that mapped to in the enum Color {Red = 1, Green, Blue} let colorName: string = Color[2]; -alert(colorName); // Displays 'Green' as its value is 2 above +console.log(colorName); // Displays 'Green' as its value is 2 above ``` # Any @@ -180,7 +180,7 @@ You may commonly see this as the return type of functions that do not return a v ```ts function warnUser(): void { - alert("This is my warning message"); + console.log("This is my warning message"); } ``` diff --git a/pages/Declaration Merging.md b/pages/Declaration Merging.md index 53ee40b61..768a7a7d8 100644 --- a/pages/Declaration Merging.md +++ b/pages/Declaration Merging.md @@ -163,7 +163,7 @@ namespace Animal { namespace Animal { export function doAnimalsHaveMuscles() { - return haveMuscles; // <-- error, haveMuscles is not visible here + return haveMuscles; // Error, because haveMuscles is not accessible here } } ``` @@ -207,7 +207,7 @@ namespace buildLabel { export let prefix = "Hello, "; } -alert(buildLabel("Sam Smith")); +console.log(buildLabel("Sam Smith")); ``` Similarly, namespaces can be used to extend enums with static members: diff --git a/pages/Generics.md b/pages/Generics.md index 0bc20b3a2..121f3547f 100644 --- a/pages/Generics.md +++ b/pages/Generics.md @@ -216,7 +216,7 @@ let stringNumeric = new GenericNumber(); stringNumeric.zeroValue = ""; stringNumeric.add = function(x, y) { return x + y; }; -alert(stringNumeric.add(stringNumeric.zeroValue, "test")); +console.log(stringNumeric.add(stringNumeric.zeroValue, "test")); ``` Just as with interface, putting the type parameter on the class itself lets us make sure all of the properties of the class are working with the same type. diff --git a/pages/Type Checking JavaScript Files.md b/pages/Type Checking JavaScript Files.md index 62ec1e90d..f821674e5 100644 --- a/pages/Type Checking JavaScript Files.md +++ b/pages/Type Checking JavaScript Files.md @@ -51,11 +51,11 @@ If properties are never set in the class body, they are considered unknown. If y In a `.js` files CommonJS module format is allowed as an input module format. Assignments to `exports`, and `module.exports` are recognized as export declarations. Similarly, `require` function calls are recognized as module imports. For example: ```ts -// import module "fs" +// Import module "fs" const fs = require("fs"); -// export function readFile +// Export function readFile module.exports.readFile = function(f) { return fs.readFileSync(f); } @@ -106,9 +106,9 @@ JSDoc annotated functions are excluded from this rule. Use JSDoc optional parame */ function sayHello(somebody) { if (!somebody) { - somebody = 'John Doe'; + somebody = "John Doe"; } - alert('Hello ' + somebody); + console.log("Hello " + somebody); } sayHello(); @@ -132,7 +132,7 @@ import { Component } from "react"; class MyComponent extends Component { render() { - this.props.b; // Allowed, since this.props is of type any + this.props.b; // Allowed, since this.props is of type any } } ``` diff --git a/pages/Type Compatibility.md b/pages/Type Compatibility.md index 291146536..96f89d923 100644 --- a/pages/Type Compatibility.md +++ b/pages/Type Compatibility.md @@ -50,7 +50,7 @@ The same rule for assignment is used when checking function call arguments: ```ts function greet(n: Named) { - alert("Hello, " + n.name); + console.log("Hello, " + n.name); } greet(y); // OK ``` From 1c491d056235e52bc43e48263b3f755a9fddde81 Mon Sep 17 00:00:00 2001 From: Emil Tholin Date: Tue, 5 Jun 2018 10:58:50 +0200 Subject: [PATCH 492/831] Update Functions.md --- pages/Functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Functions.md b/pages/Functions.md index 6df761717..8c7b085ca 100644 --- a/pages/Functions.md +++ b/pages/Functions.md @@ -53,7 +53,7 @@ TypeScript can figure the return type out by looking at the return statements, s ## Writing the function type -Now that we've typed the function, let's write the full type of the function out by looking at the each piece of the function type. +Now that we've typed the function, let's write the full type of the function out by looking at each piece of the function type. ```ts let myAdd: (x: number, y: number) => number = From 497b96fa513041346d9a74acd2ea6b9e2bd81069 Mon Sep 17 00:00:00 2001 From: William Shepherd Date: Tue, 5 Jun 2018 16:24:00 -0500 Subject: [PATCH 493/831] Fixes small grammatical error I was reading the docs and noticed a small error, so I decided to do the needful and add **the** missing article. --- pages/Namespaces and Modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Namespaces and Modules.md b/pages/Namespaces and Modules.md index ba0513c3f..713367fcf 100644 --- a/pages/Namespaces and Modules.md +++ b/pages/Namespaces and Modules.md @@ -41,7 +41,7 @@ In this section we'll describe various common pitfalls in using namespaces and m ## `/// `-ing a module A common mistake is to try to use the `/// ` syntax to refer to a module file, rather than using an `import` statement. -To understand the distinction, we first need to understand how compiler can locate the type information for a module based on the path of an `import` (e.g. the `...` in `import x from "...";`, `import x = require("...");`, etc.) path. +To understand the distinction, we first need to understand how the compiler can locate the type information for a module based on the path of an `import` (e.g. the `...` in `import x from "...";`, `import x = require("...");`, etc.) path. The compiler will try to find a `.ts`, `.tsx`, and then a `.d.ts` with the appropriate path. If a specific file could not be found, then the compiler will look for an *ambient module declaration*. From 31a807107c33ab7f89326cfd6027f8b0df4e566e Mon Sep 17 00:00:00 2001 From: Veniamin Krol Date: Thu, 7 Jun 2018 14:08:27 +0300 Subject: [PATCH 494/831] Add `--extendedDiagnostics` flag --- pages/Compiler Options.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/Compiler Options.md b/pages/Compiler Options.md index da19129eb..8461e7a85 100644 --- a/pages/Compiler Options.md +++ b/pages/Compiler Options.md @@ -21,6 +21,7 @@ Option | Type | Default `--emitDecoratorMetadata`[1] | `boolean` | `false` | Emit design-type metadata for decorated declarations in source. See [issue #2577](https://github.com/Microsoft/TypeScript/issues/2577) for details. `--esModuleInterop` | `boolean` | `false` | Emit `__importStar` and `__importDefault` helpers for runtime babel ecosystem compatibility and enable `--allowSyntheticDefaultImports` for typesystem compatibility. `--experimentalDecorators`[1] | `boolean` | `false` | Enables experimental support for ES decorators. +`--extendedDiagnostics` | `boolean` | `false` | Show verbose diagnostic information `--forceConsistentCasingInFileNames` | `boolean` | `false` | Disallow inconsistently-cased references to the same file. `--help`
`-h` | | | Print help message. `--importHelpers` | `boolean` | `false` | Import emit helpers (e.g. `__extends`, `__rest`, etc..) from [`tslib`](https://www.npmjs.com/package/tslib) From 248581c253065f74dc6b8e1730b95a0a459f6b84 Mon Sep 17 00:00:00 2001 From: SlurpTheo Date: Thu, 7 Jun 2018 09:44:14 -0500 Subject: [PATCH 495/831] Update TypeScript 1.7.md Typo in the example (200 --> 400) --- pages/release notes/TypeScript 1.7.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/release notes/TypeScript 1.7.md b/pages/release notes/TypeScript 1.7.md index 2a339fe39..a03f949d4 100644 --- a/pages/release notes/TypeScript 1.7.md +++ b/pages/release notes/TypeScript 1.7.md @@ -14,7 +14,7 @@ In the following example, each input element will be printed out one at a time w // printDelayed is a 'Promise' async function printDelayed(elements: string[]) { for (const element of elements) { - await delay(200); + await delay(400); console.log(element); } } @@ -207,4 +207,4 @@ f2({ x: 1, y: 1 }); Decorators are now allowed when targeting ES3. TypeScript 1.7 removes the ES5-specific use of `reduceRight` from the `__decorate` helper. -The changes also inline calls `Object.getOwnPropertyDescriptor` and `Object.defineProperty` in a backwards-compatible fashion that allows for a to clean up the emit for ES5 and later by removing various repetitive calls to the aforementioned `Object` methods. \ No newline at end of file +The changes also inline calls `Object.getOwnPropertyDescriptor` and `Object.defineProperty` in a backwards-compatible fashion that allows for a to clean up the emit for ES5 and later by removing various repetitive calls to the aforementioned `Object` methods. From 726ceeb2cd7d05cdc685c4429fd6ab680f315be0 Mon Sep 17 00:00:00 2001 From: Vimal Raghubir Date: Thu, 7 Jun 2018 14:43:40 -0400 Subject: [PATCH 496/831] Fix destructing function declarations example --- pages/Variable Declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index adc348114..59eee4ed5 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -580,7 +580,7 @@ But specifying defaults is more common for parameters, and getting defaults righ First of all, you need to remember to put the pattern before the default value. ```ts -function f({ a, b } = { a: "", b: 0 }): void { +function f({ a="", b=0 }): void { // ... } f(); // ok, default to { a: "", b: 0 } From daad1bf234ee8a185dd0478abfec8646158c17e1 Mon Sep 17 00:00:00 2001 From: Vimal Raghubir Date: Thu, 7 Jun 2018 14:45:56 -0400 Subject: [PATCH 497/831] Removed unnecessary comment --- pages/Variable Declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index 59eee4ed5..d4a92314d 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -583,7 +583,7 @@ First of all, you need to remember to put the pattern before the default value. function f({ a="", b=0 }): void { // ... } -f(); // ok, default to { a: "", b: 0 } +f(); ``` > The snippet above is an example of type inference, explained later in the handbook. From e76f613aae22a868c219f163766560278c5a6561 Mon Sep 17 00:00:00 2001 From: Vimal Raghubir Date: Thu, 7 Jun 2018 15:51:30 -0400 Subject: [PATCH 498/831] Added code to make function callable with no args --- pages/Variable Declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/Variable Declarations.md b/pages/Variable Declarations.md index d4a92314d..06674b589 100644 --- a/pages/Variable Declarations.md +++ b/pages/Variable Declarations.md @@ -580,7 +580,7 @@ But specifying defaults is more common for parameters, and getting defaults righ First of all, you need to remember to put the pattern before the default value. ```ts -function f({ a="", b=0 }): void { +function f({ a="", b=0 } = {}): void { // ... } f(); From 9400bf4fba955c2b75fae6b8f223efa6d5b93a19 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Sun, 10 Jun 2018 22:55:01 -0700 Subject: [PATCH 499/831] Update TypeScript 2.8.md --- pages/release notes/TypeScript 2.8.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/release notes/TypeScript 2.8.md b/pages/release notes/TypeScript 2.8.md index 4828da728..9376945c2 100644 --- a/pages/release notes/TypeScript 2.8.md +++ b/pages/release notes/TypeScript 2.8.md @@ -403,6 +403,6 @@ Starting with TypeScript 2.8 the `JSX` namespace will be looked under the `jsxNa For backward compatibility the global `JSX` namespace is used as a fallback if none was defined on the factory function. Combined with the per-file `@jsx` pragma, each file can have a different JSX factory. -# New `--emitDeclarationsOnly` +# New `--emitDeclarationOnly` -`--emitDeclarationsOnly` allows for *only* generating declaration files; `.js`/`.jsx` output generation will be skipped with this flag. The flag is useful when the `.js` output generation is handled by a different transpiler like Babel. +`--emitDeclarationOnly` allows for *only* generating declaration files; `.js`/`.jsx` output generation will be skipped with this flag. The flag is useful when the `.js` output generation is handled by a different transpiler like Babel. From 01779ded8d4c191f4477bd9005aad23738b24088 Mon Sep 17 00:00:00 2001 From: loveky Date: Thu, 14 Jun 2018 10:36:57 +0800 Subject: [PATCH 500/831] docs(jsx): add missing {} --- pages/JSX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/JSX.md b/pages/JSX.md index 990871fac..1986c4054 100644 --- a/pages/JSX.md +++ b/pages/JSX.md @@ -123,7 +123,7 @@ interface FooProp { declare function AnotherComponent(prop: {name: string}); function ComponentFoo(prop: FooProp) { - return ; + return ; } const Button = (prop: {value: string}, context: { color: string }) =>