BT
x Share your thoughts on trends and content!

TypeScript 1.8 Brings Module Augmentation Support

by on Mar 01, 2016 |

Microsoft has released version 1.8 of TypeScript, its open source superset of JavaScript.

Following on from the language's beta announcement last month, Microsoft program manager Bowden Kelly wrote in the blog post Announcing TypeScript 1.8 that on top of bringing the ability to use JavaScript code within a TypeScript project, the latest version also "provides full support for module augmentation."

Elaborating on the subject, Kelly said that would "allow users to design more modular libraries via module augmentation," helping them to extend existing modules and letting them choose if they want to import the whole module or a subset of it. This is achieved by adding an ambient module declaration and extending existing types.

Kelly provides the following example:

// scale.ts
export class Scale {
    weightOnEarth(mass) {}
}
// advancedScale.ts
import { Scale } from "./scale" ;
// create augmentation for Scale
declare module "./scale" {
    // Augment Core class via interface merging
    interface Scale {
        weightOnMoon(mass); // not everyone needs moon weight
    }
}
Scale.prototype.advancedMethod = /* insert implementation */;

// consumer.ts
import { Scale } from "./scale";
import "./advancedScale";

let scale: Scale;
scale.weightOnMoon(10);  // ok

Microsoft first started supporting React with the beta release of version 1.6 last September, and version 1.8's stable release has simplified the declaration of props types in React.

Succinctly explained, developers no longer need to explicitly declare ref and key or extend React.Props. On top of this, the update means ref and key properties will now appear with correct types on all components, and ref is correctly disallowed on instances of Stateless Function components.

Improved in TypeSccript 1.8 is the language's union/intersection type inference, such as when inferring from string | string[] to string | T, the types are reduced to string[] and T, inferring string[] for T, as in the below example

type Maybe<T> = T | void;

function isDefined<T>(x: Maybe<T>): x is T {
    return x !== undefined && x !== null;
}

function isUndefined<T>(x: Maybe<T>): x is void {
    return x === undefined || x === null;
}

function getOrElse<T>(x: Maybe<T>, defaultValue: T): T {
    return isDefined(x) ? x : defaultValue;
}

function test1(x: Maybe<string>) {
    let x1 = getOrElse(x, "Undefined");         // string
    let x2 = isDefined(x) ? x : "Undefined";    // string
    let x3 = isUndefined(x) ? "Undefined" : x;  // string
}

function test2(x: Maybe<number>) {
    let x1 = getOrElse(x, -1);         // number
    let x2 = isDefined(x) ? x : -1;    // number
    let x3 = isUndefined(x) ? -1 : x;  // number
}

Full details of improvements and changes in TypeScript 1.8 can be found on the project's GitHub here.

Rate this Article

Relevance
Style

Hello stranger!

You need to Register an InfoQ account or or login to post comments. But there's so much more behind being registered.

Get the most out of the InfoQ experience.

Tell us what you think

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread
Community comments

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Email me replies to any of my messages in this thread

Discuss
General Feedback
Bugs
Advertising
Editorial
Marketing
InfoQ.com and all content copyright © 2006-2016 C4Media Inc. InfoQ.com hosted at Contegix, the best ISP we've ever worked with.
Privacy policy
BT

We notice you're using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.