TypeScript 1.7

Example

In the following example, each input element will be printed out one at a time with a 400ms delay:

For more information see blog post.

Support for —target ES6 with —module

TypeScript 1.7 adds ES6 to the list of options available for the —module flag and allows you to specify the module output when targeting ES6.This provides more flexibility to target exactly the features you want in specific runtimes.

Example
  1. {
  2. "compilerOptions": {
  3. "module": "amd",
  4. "target": "es6"
  5. }
  6. }

It is a common pattern to return the current object (i.e. this) from a method to create fluent-style APIs.For instance, consider the following BasicCalculator module:

  1. export default class BasicCalculator {
  2. public constructor(protected value: number = 0) { }
  3. public currentValue(): number {
  4. return this.value;
  5. }
  6. public add(operand: number) {
  7. this.value += operand;
  8. }
  9. public subtract(operand: number) {
  10. this.value -= operand;
  11. return this;
  12. }
  13. this.value *= operand;
  14. return this;
  15. }
  16. public divide(operand: number) {
  17. this.value /= operand;
  18. return this;
  19. }
  20. }

A user could express 2 * 5 + 1 as

  1. import BasicCalculator from "./BasicCalculator";
  2. export default class ScientificCalculator extends BasicCalculator {
  3. public constructor(value = 0) {
  4. super(value);
  5. }
  6. public square() {
  7. return this;
  8. }
  9. public sin() {
  10. this.value = Math.sin(this.value);
  11. return this;
  12. }
  13. }

Because TypeScript used to infer the type BasicCalculator for each method in that returned this, the type system would forget that it had ScientificCalculator whenever using a BasicCalculator method.

For instance:

  1. import calc from "./ScientificCalculator";
  2. let v = new calc(0.5)
  3. .square()
  4. .divide(2)
  5. .sin() // Error: 'BasicCalculator' has no 'sin' method.
  6. .currentValue();

This is no longer the case - TypeScript now infers this to have a special type called this whenever inside an instance method of a class.The this type is written as so, and basically means “the type of the left side of the dot in a method call”.

The this type is also useful with intersection types in describing libraries (e.g. Ember.js) that use mixin-style patterns to describe inheritance:

ES7 exponentiation operator

TypeScript 1.7 supports upcoming ES7/ES2016 exponentiation operators: and =.The operators will be transformed in the output to ES3/ES5 using Math.pow.

Example
  1. var x = 2 ** 3;
  2. var y = 10;
  3. y **= 2;
  4. var z = -(4 ** 3);
  1. var x = Math.pow(2, 3);
  2. var y = 10;
  3. y = Math.pow(y, 2);
  4. var z = -(Math.pow(4, 3));

TypeScript 1.7 makes checking of destructuring patterns with an object literal or array literal initializers less rigid and more intuitive.

When an object literal is contextually typed by the implied type of an object binding pattern:

  • Properties with default values in the object binding pattern become optional in the object literal.
  • Properties in the object binding pattern that have no match in the object literal are required to have a default value in the object binding pattern and are automatically added to the object literal type.
  • Elements in the array binding pattern that have no match in the array literal are required to have a default value in the array binding pattern and are automatically added to the array literal type.

Example

Support for decorators when targeting ES3

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 methods.