TypeScript1.8以éã§è¿½å äºå®ã¾ãã¯åè°ä¸ã®æ³¨ç®ã®æ°æ©è½ãç´¹ä»ãã¾ãã
ãã®è¨äºã¯TypeScript ã¢ããã³ãã«ã¬ã³ãã¼2015 25æ¥ç®ã®è¨äºã§ãã
æ»ãå¤åã®å³æ ¼ãªæ¤æ»(--noImplicitReturns
) [Merged]
æ»ãå¤ãå®ç¾©ããå以å¤ã«ãªããã¨ãç¦æ¢ãã¾ãã å¿ ããªã³ã«ãã¾ããããããªãçç±ãããã¾ããã ãã®èª¿åã§Flowtypeã¨åå®å ¨æ§ãã¬ã³ã¬ã³ç«¶ã£ã¦ã»ããã¨ããã§ãã
// The followings are all wrong in a typed context yet the compiler ignores them as a valid code: function SomeMethod(): number { return; } function SomeMethod(): number { return null; } function SomeMethod(): number { if (false) return 1; } function SomeMethod(): number { try { return 0; } catch (ex) { } }
Nullableåã®ç¦æ¢(--noImplicitNull
) [Suggestion]
nullãvoidãanyãvoid以å¤ã®åã«æ··å
¥ããªãããæé»çãªãã£ã¹ããç¦æ¢ãã¾ãã
å¤æ°ãªãconst
ã使ãæ¹æ³ãããã®ã§ãããªãã¸ã§ã¯ãããã©ã¡ã¼ã¿ã¼ã¯ããã¯ããã¾ããã
--noImplicitNull
ãªãã·ã§ã³ã§ã®å¶å¾¡ãæ¯æãã¦ãã¾ãã
ãã°ã®ãªãä¸çã®ããã«ä»ãã+1ï¼
let n: number = null; // error let m: number = undefined; // error
ã¿ã¤ãã¬ã¼ãã¸ã®ã³ã³ããã¼ã«ããã¼è§£æã®é©ç¨ [Discussion]
ã¿ã¤ãã¬ã¼ãã¯ããã¾ã§æ¡ä»¶åå²å ã®ãããã¯ãå¼ã«ããé©ç¨ããã¾ããã§ãããã¿ã¤ãã¬ã¼ãã®çµæã以éã®ãã¹ã¦ã®ã³ã¼ãã«é©ç¨ãããããã«ãªãã®ã§ã¬ã¼ãç¯ãå解決ã«ä½¿ããããã«ãªãã¾ãã ã¾ã åè°ä¸ãªã®ã§ãã²+1ãã¦ãã¦ãã ããã
function foo(x: number | string) { if (typeof x === 'string') { return; } // x should now be a number if (2 % x !== 0) { // do something } }
String Literal Types [Merged]
å¤æ°ãé¢æ°ã«ä¸ããããæååã®å¤ãå¶éã§ããããã«ãªãã¾ãã ãããã¦ãã
type CardinalDirection = "North" | "East" | "South" | "West"; function move(distance: number, direction: CardinalDirection) { // ... } let a: "foo" | number = "foo"; // valid let b: "bar" | "baz" = "foo"; // invalid
Readonly(final)ã¢ã¯ã»ã¹ä¿®é£¾å [Scheduled]
ããããã£ã®å代å
¥ãåã¨ãã¦ç¦æ¢ããä¸å¤ãªãã¸ã§ã¯ãã®å®ç¾©ãå¯è½ã«ãã¾ãã
å¾
ã¡æã¾ããæ©è½ã§ãã
å人çã«ã¯final
ã®ã»ãã好ãã§ãã
interface Point { x: number; y: number; } interface ImmutablePoint { readonly x: number; readonly y: number; } var pt: ImmutablePoint = { x: 4, y: 5 }; // OK, can convert mutable to non-mutable pt.x = 5; // Error, 'pt.x' is not a valid target of assignment var pt2: Point = pt; // Error, cannot convert readonly 'x' to mutable 'x' // Possibly bad behavior var pt3: Point = { x: 1, y: 1 }; var pt4: ImmutablePoint = pt3; // OK pt3.x = 5; // pt4.x is also changed? // Really bad behavior /** This function was written in TypeScript 1.0 **/ function magnitudeSquared(v: { x: number; y: number }) { return v.x * v.x + v.y * v.y; } // Now try to use it with ImmutablePoint console.log(magnitudeSquared(pt)); // Error, cannot use readonly object in non-readonly call
object
åã®è¿½å [Accepted]
ä»ã¾ã§å°å³ã«ãªãã¸ã§ã¯ãåã§å¶ç´ããåãããã¾ããã§ãããããã§ããããå¶ç´ã§ããããã«ãªãã¾ãã
åºåããJSã¢ã¸ã¥ã¼ã«ãã¡ã¤ã«ã®çµå [Merged]
åºåããJSã¢ã¸ã¥ã¼ã«ãã¡ã¤ã«ã1ã¤ã®ãã¡ã¤ã«ã«çµåãã¾ãã
Browserifyããããªããªããªãã¾ãã åã«ãªãã·ã§ã³ã使ã£ã¦çµåããã ãã§ã¯requirejsã«ä¾åãã¾ããã以ä¸ã®ã¹ããããããããã¨ãã¦è¿½å ãããã¨ã§ãã©ã¦ã¶ã§ãNodeã§ãåä½ããIsomorphicãªã©ã¤ãã©ãªã¨ãªãã¾ãã
ãã¡ãã®ã©ã¤ãã©ãªã§å®éã«ãã®æ©è½ã使ã£ã¦Browserifyãªãã§åãç¸äºéç¨æ§ãå®ç¾ãã¦ãã¾ãã®ã§è©¦ãã¦ã¿ããæ¹ã¯åèã«ããã¨ããã§ãããã
循ç°åç §ã許ããã¾ãããããªããããªããã¨ããæ°æã¡ã«ãªãã°åé¡ããã¾ããã
ãã¡ã¤ã«ãã¹ã®globã«ãããã¿ã¼ã³ããã [Scheduled]
ãã¡ã¤ã«ãã¹ã«ã¯ã¤ã«ãã«ã¼ããªã©ã®globã®ãã¿ã¼ã³ãããã使ããããã«ãã¾ãã ã³ã³ãã¤ã«ãããã¡ã¤ã«ãä½ååãåæãã¦ã¡ã³ãã¾ã§ããã®ã¯ã¤ãããã¾ãã v2.xã§å®è£ ãäºå®ããã¦ãã¾ãã
Union/Intersection typesã®åæ¨è«å¼·å [Merged]
Union/Intersection typeã®å解æã®åæ¨è«ãå¼·åããåå©ç¨æ§ãåä¸ãã¾ãã ã¨ã¦ãããããã
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 }
thisã®åå®ç¾©ã¨åæ¨è« [Discussion]
thisã®åå®ç¾©ã¯é¿ãã¦ã¯éããªãã®ã§ã¯ãªãã§ããããã ã¯ã©ã¹ã®èªå·±åã¨ãã¦ã®thisã¯TS1.7ã®ããªã¢ã¼ãã£ãã¯thisã§å®è£ æ¸ã¿ã§ãã
let f = function(this: {data: number}) { console.log(this.data2) } let o = { data: 12 f: f g: function() { // this is inferred from the contextual type console.log(this.data); } }
function f(this: {n: number}, m: number) { return this.n + m; } class C { n: number m1(this:this, m: number) { return this.n + m } m2(this: {n: number}, m: number) { return this.n + m } }
åãã©ã¡ã¼ã¿ã¼ã«ããå¶ç´ [Merged]
åãã©ã¡ã¼ã¿ã¼ã§åãã©ã¡ã¼ã¿ã¼ã®å¶ç´ãä½ããããã«ãªãã¾ãã ä»ã¾ã§ä½åº¦ãã®åãæ¸ããã«æ¶ã飲ãã ããããã¾ããã
function assign<T extends U, U>(target: T, source: U): T { for (let id in source) { target[id] = source[id]; } return target; } let x = { a: 1, b: 2, c: 3, d: 4 }; assign(x, { b: 10, d: 20 }); assign(x, { e: 0 }); // Error
?
ããããã£ã¼ã¢ã¯ã»ãµ [Suggestion]
CoffeeScriptã®ä¾¿å©ãªãã¤ã§ãã
ESã®ä»æ§ã«å
¥ã£ã¦ã»ãããããã§ãã
ãã æåã«ææ¡ããããã®ã¯x?.y?.z
ã®æ»ãå¤ã®åãx|y|z
ã§ãã¾ãããããããã¾ããã
var x = { y: { z: null, q: undefined } }; console.log(x?.y?.z?.foo); // Should print 'null' console.log(x?.baz); // Still an error console.log(x.y.q?.bar); // Should print 'undefined'
ãã¹ã¿ã¤ã(ãã¹ã)ã¯ãã¶ã¤ã³ [Design]
ãã¤ã¯ãã½ããã«ããã¨æããã¹ã£ã¦ç«ã¦ãããIssueã¯ãã¶ã¤ã³ã«ãããã®ã ããã§ãã
èã
ã¾ã¨ã
TypeScriptã¯ãã¼ã¸ã§ã³ã¢ãããéãããã³ã«ã¾ãã¾ãæ´ç·´ããã¦ãããæ¥å¹´ã¯ä¸è¿°ã®æ©è½ã®è¿½å ã«ããããã«èºé²ãæå¾ ããã¾ãã
2016å¹´ãããã«ãã¼ãã¢ããããTypeScriptãããããã