å 責äºé ïŒãã®åé¡ã¯ããããŒãTypeScriptãããåªããŠãããæªããã蚌æããããšãç®çãšãããã®ã§ã¯ãããŸãããäž¡æ¹ã®ããŒã ã®ãã°ãããææãæ¹å€ãããã¯ãããŸããããFlowãšTypeScriptã®åã·ã¹ãã ã®éãããªã¹ãããŠã©ã¡ãã®æ©èœãè©äŸ¡ããããšããŠããŸãTypeScriptãæ¹åããå¯èœæ§ããããŸãã
ãŸããç®çã¯TypeScriptãæ¹åããããšã§ãããããFlowã§æ¬ èœããŠããæ©èœã«ã€ããŠã¯èª¬æããŸããã
æåŸã«ããã®ãããã¯ã¯åã·ã¹ãã ã«ã€ããŠã®ã¿ã§ããããµããŒããããŠãães6 / es7æ©èœã«ã€ããŠã§ã¯ãããŸããã
mixed
ããã³any
ãããŒããã¥ã¡ã³ãããïŒ
- æ··åïŒãã¹ãŠã®ã¿ã€ãã®ãã¹ãŒããŒã¿ã€ããã ã©ã®ã¿ã€ããæ··åã«æµã蟌ãå¯èœæ§ããããŸãã
- anyïŒãåçãã¿ã€ãã ã©ã®ã¿ã€ããã©ã®ã¿ã€ãã«ãæµã蟌ãããšãã§ãããã®éãå¯èœã§ãã
åºæ¬çã«ãããã¯ãããŒã§any
ãTypeScript any
ãšåçã§ããã mixed
ãTypeScript {}
ãšåçã§ããããšãæå³ããŸãã
Object
ã¿ã€ããããŒããã¥ã¡ã³ãããïŒ
æ··åã䜿çšããŠãäœã§ãåãããšãã§ããå Žæã«æ³šéãä»ããŸããã代ããã«Objectã䜿çšããªãã§ãã ããã ãã¹ãŠããªããžã§ã¯ããšããŠèŠãã®ã¯çŽããããã§ããäžãäžãä»»æã®ãªããžã§ã¯ãããæå³ããå Žåã¯ããä»»æã®é¢æ°ããæå®ããæ¹æ³ãšåãããã«ããããæå®ããããè¯ãæ¹æ³ããããŸãã
TypeScriptã§ã¯Object
ã¯{}
ãšåçã§ãããä»»æã®åãåãå
¥ããŸããFlowã§ã¯Object
ã¯{}
ãšåçã§ããã mixed
ãšã¯ç°ãªããŸãã string
ã number
ã boolean
ã function
ãªã©ã®ä»ã®ããªããã£ãåã¯åãå
¥ããŸããïŒã
function logObjectKeys(object: Object): void {
Object.keys(object).forEach(function (key) {
console.log(key);
});
}
logObjectKeys({ foo: 'bar' }); // valid with TypeScript and Flow
logObjectKeys(3); // valid with TypeScript, Error with flow
ãã®äŸã§ã¯ã logObjectKeys
ã®ãã©ã¡ãŒã¿ãŒã¯ã¿ã€ãObject
ã§ã¿ã°ä»ããããŠããŸããããã¯ã {}
ãšåçã®TypeScriptã§ããããã number
ãªã©ã®ä»»æã®ã¿ã€ããåãå
¥ããŸãã logObjectKeys(3)
ã
Flowã§ã¯ãä»ã®ããªããã£ãåã¯Object
ãšäºææ§ããªããããã¿ã€ããã§ãã«ãŒã¯2åç®ã®åŒã³åºãã§ãšã©ãŒãå ±åããŸãlogObjectKeys(3)
ïŒ_ numberã¯Object_ãšäºææ§ããããŸããã
ãããŒããã¥ã¡ã³ãããïŒ
JavaScriptã§ã¯ãnullã¯æé»çã«ãã¹ãŠã®ããªããã£ãåã«å€æãããŸãã ãŸãããããããªããžã§ã¯ãã¿ã€ãã®æå¹ãªäœæ°ã§ããããŸãã
å¯Ÿç §çã«ãFlowã¯ãnullãä»ã®ã¿ã€ãã®äžéšã§ã¯ãªãå¥åã®å€ãšèŠãªããŸãã
ãããŒããã¥ã¡ã³ãã»ã¯ã·ã§ã³ãåç §ããŠãã ãã
ãããŒããã¥ã¡ã³ãã¯ããªãå®æããŠããã®ã§ããã®æ©èœã«ã€ããŠã¯è©³ãã説æããŸãããéçºè ã¯ããã¹ãŠã®å€æ°ãåæåããããnull蚱容ãšããŠããŒã¯ããå¿ èŠãããããšã«æ³šæããŠãã ããã
var test: string; // error undefined is not compatible with `string`
var test: ?string;
function getLength() {
return test.length // error Property length cannot be initialized possibly null or undefined value
}
ãã ããTypeScriptã¿ã€ãã¬ãŒãæ©èœã®å Žåãšåæ§ã«ããããŒã¯null以å€ã®ãã§ãã¯ãç解ããŸãã
var test: ?string;
function getLength() {
if (test == null) {
return 0;
} else {
return test.length; // no error
}
}
function getLength2() {
if (test == null) {
test = '';
}
return test.length; // no error
}
ãããŒããã¥ã¡ã³ãã»ã¯ã·ã§ã³ãåç
§ããŠãã ãã
Correspondin TypeScriptã®åé¡ïŒ1256ãåç
§ããŠãã ãã
TypeScriptãããŒã¯å
±çšäœåããµããŒãããããã«ãåãçµã¿åãããæ°ããæ¹æ³ã§ãã亀差åããµããŒãããŸãã
ãªããžã§ã¯ãã®å Žåã亀差åã¯ããã¯ã¹ã€ã³ã宣èšãããããªãã®ã§ãã
type A = { foo: string; };
type B = { bar : string; };
type AB = A & B;
ABã®ã¿ã€ãã¯{ foo: string; bar : string;}
ã§ãã
é¢æ°ã®å ŽåããªãŒããŒããŒãã宣èšããã®ãšåãã§ãã
type A = () => void & (t: string) => void
var func : A;
ãšåçã§ãïŒ
interface A {
(): void;
(t: string): void;
}
var func: A
次ã®TypeScriptã®äŸãèããŠã¿ãŸãããã
declare function promisify<A,B>(func: (a: A) => B): (a: A) => Promise<B>;
declare function identity<A>(a: A): A;
var promisifiedIdentity = promisify(identity);
TypeScriptã䜿çšãããšã promisifiedIdentity
ã¯æ¬¡ã®ã¿ã€ãã«ãªããŸãã
(a: {}) => Promise<{}>`.
ãããŒã®å Žåã promisifiedIdentity
ã¯æ¬¡ã®ã¿ã€ãã«ãªããŸãã
<A>(a: A) => Promise<A>
ãããŒã¯äžè¬ã«ãTypeScriptãããå€ãã®ã¿ã€ããæšæž¬ããããšããŸãã
ãã®äŸãèŠãŠã¿ãŸãããïŒ
function logLength(obj) {
console.log(obj.length);
}
logLength({length: 'hello'});
logLength([]);
logLength("hey");
logLength(3);
TypeScriptã§ã¯ããšã©ãŒã¯å ±åãããŸããããããŒã§ã¯ã number
length
ããããã£ããªãããã logLength
ã®æåŸã®åŒã³åºãã§ãšã©ãŒãçºçããŸãã
ãããŒã§ã¯ãå€æ°ãæ瀺çã«å ¥åããªãéãããã®å€æ°ã®ã¿ã€ãã¯ãã®å€æ°ã®äœ¿çšæ³ã«ãã£ãŠå€ãããŸãã
var x = "5"; // x is inferred as string
console.log(x.length); // ok x is a string and so has a length property
x = 5; // Inferred type is updated to `number`
x *= 5; // valid since x is now a number
ãã®äŸã§ã¯ãxã¯æåã¯string
ã¿ã€ãã§ãããçªå·ã«å²ãåœãŠããããšãã¿ã€ãã¯number
å€æŽãããŸããã
ã¿ã€ãã¹ã¯ãªããã§ã¯ã x
ã以åã«string
å²ãåœãŠãããŠããããã®ã¿ã€ããå€æŽã§ããªããããå²ãåœãŠx = 5
ã¯ãšã©ãŒã«ãªããŸãã
ãã1ã€ã®éãã¯ãFlowãåæšè«ãéæ¹åã«äŒæ¬ããŠãæšè«ãããåãåå ±çšäœã«æ¡åŒµããããšã§ãã ãã®äŸã¯facebook / flowïŒ67ïŒã³ã¡ã³ãïŒããã®ãã®ã§ã
class A { x: string; }
class B extends A { y: number; }
class C extends A { z: number; }
function foo() {
var a = new B();
if (true) a = new C(); // TypeScript reports an error, because a's type is already too narrow
a.x; // Flow reports no error, because a's type is correctly inferred to be B | C
}
ïŒãæ£ãããã¯å
ã®æçš¿ããã®ãã®ã§ããïŒ
ãããŒã¯ã a
å€æ°ãæ¡ä»¶ã¹ããŒãã¡ã³ãã«å¿ããŠB
ã¿ã€ããŸãã¯C
ã¿ã€ããæã€å¯èœæ§ãããããšãæ€åºããããã B | C
ãšæšæž¬ãããããã«ãªããŸãããã¹ããŒãã¡ã³ãa.x
ã¯ãäž¡æ¹ã®ã¿ã€ãã«x
ããããã£ãããããããšã©ãŒã«ã¯ãªããŸããã z
ããããã£ã«ã¢ã¯ã»ã¹ããããšãããšããšã©ãŒãçºçããŸãã
ããã¯ã以äžãã³ã³ãã€ã«ãããããšãæå³ããŸãã
var x = "5"; // x is inferred as string
if ( true) { x = 5; } // Inferred type is updated to string | number
x.toString(); // Compiles
x += 5; // Compiles. Addition is defined for both string and number after all, although the result is very different
mixed
ã»ã¯ã·ã§ã³ãšany
ã»ã¯ã·ã§ã³ãæŽæ°ããŸããã mixed
mixed
ã¯{}
ãšåçã§ãããããããšãã°å¿
èŠãããŸãããObject
ã¿ã€ãã®ã»ã¯ã·ã§ã³ãè¿œå ããŸããã_äœããå¿ããå Žåã¯ãåé¡ãæŽæ°ããããšæããŸãã®ã§ããæ°è»œã«ãç¥ãããã ããã_
ããã¯èå³æ·±ããã®ã§ãããããã«è°è«ããããã®è¯ãåºçºç¹ã§ãã ããããããããããã«ãå ã®æçš¿ã«ã³ããŒç·šéã®å€æŽãå ããŠãããããã§ããïŒ
ãããŒå ã®äºæããªããã®ïŒè©³çŽ°ã調æ»ãããšãã«ãã®ã³ã¡ã³ããæŽæ°ããŸãïŒ
å¥é¢æ°ã®åŒæ°åæšè«ïŒ
/** Inference of argument typing doesn't seem
to continue structurally? **/
function fn1(x) { return x * 4; }
fn1('hi'); // Error, expected
fn1(42); // OK
function fn2(x) { return x.length * 4; }
fn2('hi'); // OK
fn2({length: 3}); // OK
fn2({length: 'foo'}); // No error (??)
fn2(42); // Causes error to be reported at function definition, not call (??)
ãªããžã§ã¯ããªãã©ã«ããã®åæšè«ã¯ãããŸããïŒ
var a = { x: 4, y: 2 };
// No error (??)
if(a.z.w) { }
ããã¯èå³æ·±ããã®ã§ãããããã«è°è«ããããã®è¯ãåºçºç¹ã§ãã ããããããããããã«ãå ã®æçš¿ã«ã³ããŒç·šéã®å€æŽãå ããŠãããããã§ããïŒ
ç§ãèšã£ãããã«ãç®çã¯ãããŒã¿ã€ãã·ã¹ãã ã«æè³ããŠãããã€ãã®æ©èœãTypeScriptã·ã¹ãã ã«é©åãããã©ããã確èªããããšã§ãã
@RyanCavanaughæåŸã®äŸã ãšæããŸãïŒ
var a = { x: 4, y: 2 };
// No error (??)
if(a.z.w) { }
ãã«ãã§ãã¯ã¢ã«ãŽãªãºã ã«é¢é£ãããã°ã§ããå ±åããŸãã
ã§ã
type A = () => void & (t: string) => void
var func : A;
ã«çžåœ
Declare A : () => void | (t: string) => void
var func : A;
ãããšããããããããŸãããïŒ
@ Davidhanson90å®éã«ã¯ããã§ã¯ãããŸããïŒ
declare var func: ((t: number) => void) | ((t: string) => void)
func(3); //error
func('hello'); //error
ãã®äŸã§ã¯ããããŒã¯å
±çšäœã¿ã€ãfunc
ã®ã©ã®ã¿ã€ãã§ããããç¥ãããšãã§ããªããããã©ã¡ãã®å Žåããšã©ãŒãå ±åããŸãã
declare var func: ((t: number) => void) & ((t: string) => void)
func(3); //no error
func('hello'); //no error
funcã«ã¯äž¡æ¹ã®ã¿ã€ãããããããäž¡æ¹ã®åŒã³åºããæå¹ã§ãã
TypeScriptã®{}
mixed
ãšFlowã®
@RyanCavanaughèããåŸãç§ã¯æ¬åœã«ããããŸãããããã¯ãŸã ããã«ã€ããŠèããŠããã®ãšã»ãšãã©åãã ãšæããŸãã
ããã¯ééã£ãŠããŸããmixed
ã¯ããããã£ããªãã {}
ãæã£ãŠããObject.prototypeããç¶æ¿ãããããããã£ããããŸããïŒïŒ1108ïŒ
ãã1ã€ã®éãã¯ãFlowãåæšè«ãéæ¹åã«äŒæ¬ããŠãæšè«ãããåãåå ±çšäœã«æ¡åŒµããããšã§ãã ãã®äŸã¯https://github.com/facebook/flow/issues/67#issuecomment-64221511ããã®ãã®ã§ã
class A { x: string; }
class B extends A { y: number; }
class C extends A { z: number; }
function foo() {
var a = new B();
if (true) a = new C(); // TypeScript reports an error, because a's type is already too narrow
a.x; // Flow reports no error, because a's type is correctly inferred to be B | C
}
ïŒãæ£ãããã¯å ã®æçš¿ããã®ãã®ã§ããïŒ
ããã¯ã以äžãã³ã³ãã€ã«ãããããšãæå³ããŸãã
var x = "5"; // x is inferred as string
if ( true) { x = 5; } // Inferred type is updated to string | number
x.toString(); // Compiles
x += 5; // Compiles. Addition is defined for both string and number after all, although the result is very different
ç·šéïŒ2çªç®ã®ã¹ããããããã¹ãããŸããããå®éã«ã³ã³ãã€ã«ãããŸãã
ç·šé2ïŒä»¥äžã®@fdecampredonã§ææãããŠif (true) { }
ã¯ããããŒã«ã¿ã€ããstring | number
ãšããŠæšæž¬ãããå¿
èŠããããŸãã if (true)
ããªããšã代ããã«number
ãšããŠæšæž¬ãããŸãã
ããªãã¯ãã®è¡åã奜ãã§ããïŒ å ±çšäœã®ã¿ã€ãã«ã€ããŠè©±ãåã£ããšãã«ãã®ã«ãŒãããã©ããŸãããããã®äŸ¡å€ã¯çããããã®ã§ãã åã·ã¹ãã ãè€æ°ã®å¯èœãªç¶æ ãæã€åãã¢ãã«åã§ããããã«ãªã£ããããšãã£ãŠãããããã©ãã§ã䜿çšããããšãæãŸãããšã¯éããŸããã è¡šé¢äžãéçåãã§ãã«ãŒãåããèšèªã䜿çšããããšãéžæããã®ã¯ãå泚éãæžãã®ã奜ãã ãããšããçç±ã ãã§ãªããééããç¯ãããšãã«ã³ã³ãã€ã©ãŒãšã©ãŒãå¿ èŠã ããã§ã;ïŒã€ãŸããã»ãšãã©ã®èšèªã¯ãã®ãããªäŸã§ãšã©ãŒãåºããŸãïŒç¹ã«2ã€ç®ã¯ãå空éãã¢ãã«åããæ¹æ³ããªãããã§ã¯ãªãããããã³ãŒãã£ã³ã°ãšã©ãŒã§ãããšå®éã«ä¿¡ããŠããããã§ãïŒåæ§ã®çç±ã§ãå€ãã®æé»ã®ãã£ã¹ã/å€ææäœããµããŒãããããšãé¿ããŠããŸãïŒã
åãè«çã§ãç§ã¯ãã®æ¯ãèããæåŸ ããŸãïŒ
declare function foo<T>(x:T, y: T): T;
var r = foo(1, "a"); // no problem, T is just string|number
ããããç§ã¯æ¬åœã«ãã®æ¯ãèããæãã§ããŸããã
@danquirkãšã©ãŒãå ±åãã代ããã«èªåçã«å
±çšäœåãæšæž¬ããããšã¯ãç§ã奜ãåäœã§ã¯ãªãããšã«åæããŸãã
ããããããã¯å®éã®èšèªã§ã¯ãªãããããŒã®å²åŠã«ç±æ¥ãããšæããŸãããããŒããŒã ã¯ãåçŽã«åãã§ãã«ãŒãäœæããããšããŸããæçµçãªç®æšã¯ãåã®æ³šéãªãã§ãããå®å
šãªãã³ãŒããäœæã§ããããã«ããããšã§ãã ããã«ãããå³æ Œããç·©åãããŸãã
ãã®çš®ã®è¡åã®åœ±é¿ãããã¯ããããšãèãããšãæ£ç¢ºãªå³å¯ãã¯è°è«ã®äœå°ããããŸãã å€ãã®å Žåããšã©ãŒã延æããïŒãŸãã¯ãšã©ãŒãå®å
šã«é衚瀺ã«ããïŒã ãã§ãã ååŒæ°ã®å€ãåæšè«èŠåã¯ãåæ§ã®å²åŠãéåžžã«åæ ããŠããŸãã çãããå Žåã¯ãã¿ã€ããã©ã¡ãŒã¿ããšã©ãŒã«ããã®ã§ã¯ãªã{}ãšæšæž¬ããŸããã ããã¯ãããã€ãã®éæããªããšãå®è¡ããŠããçµæã«å¯ŸããŠå®å
šã«ããã€ãã®æå°éã®åäœã»ãããå®è¡ã§ããããšãæå³ããŸããïŒã€ãŸãã toString
ãããªãã®ïŒã äžéšã®äººã
ãJSã§éæããªããšããããšããçè«çæ ¹æ ã¯ãç§ãã¡ãã§ããããšãèš±å¯ããããã«åªããã¹ãã§ãã ãããå®éã«ã¯ã{}ã®æšè«ã®å€§éšåã¯å®éã«ã¯åãªããšã©ãŒã§ããã T
åã®å€æ°ãæåã«ç¹åšãããŠã{}ïŒãŸãã¯åæ§ã«äºæããªãå
±çšäœåïŒã§ããããšã«æ°ä»ããŸã§åŸ
ãããŸãããããŠãåŸæ¹ãžã®ãã¬ãŒã¹ã¯ããããè¿·æã§ããã ããããä»ããããšããªãïŒãŸãã¯ã¿ã€ãTã®äœããè¿ããªãã£ãïŒå Žåã¯ãå®è¡æã«äœããççºããïŒãŸãã¯ããã«æªãããšã«ããŒã¿ãç ŽæããïŒãŸã§ããšã©ãŒã«ãŸã£ããæ°ã¥ããŸããã§ããã åæ§ã«ïŒ
declare function foo(arg: number);
var x = "5";
x = 5;
foo(x); // error
ããã§ã®ãšã©ãŒã¯äœã§ããïŒ æ¬åœã«x
ãfoo
æž¡ãã®ã§ããïŒ ãããšããåæåããããã®ãšã¯å®å
šã«ç°ãªãã¿ã€ãã®å€ãx
ã«åå²ãåœãŠããã®ã§ããããã 人ã
ãæ¬åœã«æå³çã«ãã®çš®ã®ååæåãè¡ãã®ã«å¯ŸããŠã誀ã£ãŠäœããèžã¿ã€ããã®ã¯ã©ããããã®é »åºŠã§ããïŒ ãããã«ããã x
å
±çšäœåãæšæž¬ããããšã§ãããã§ãïŒããæªãïŒãšã©ãŒãçºçããå Žåãåã·ã¹ãã ã¯å
šäœçã«ããã»ã©å³å¯ã§ã¯ãªãã£ããšæ¬åœã«èšããŸããïŒ ãã®çš®ã®æšè«ã¯ãçµæã®åã§ç¹ã«æå³ã®ããããšãäœãããªãå Žåã«ã®ã¿ãããã»ã©å³å¯ã§ã¯ãªããªããŸããããã¯äžè¬çã«éåžžã«ãŸãã§ãã
ã»ãŒééããªãã null
ãšundefined
ãä»»æã®åã«å²ãåœãŠå¯èœãªãŸãŸã«ããŠãããšãåãæ¹æ³ã§ãšã©ãŒãé衚瀺ã«ãªããŸããã»ãšãã©ã®å Žåãããåã§åæå®ããã null
å€ãé衚瀺ã«ãããšãå®è¡æã®ãšã©ãŒã
Flowã®ããŒã±ãã£ã³ã°ã®éèŠã§ãªãéšåã¯ãTSãany
ãæšæž¬ããå Žæã§ãã¿ã€ããã§ãã«ãŒãã³ãŒããããç解ãããšããäºå®ã«åºã¥ããŠããŸãã ãã®å²åŠã¯ãã³ã³ãã€ã©ã«åãæšæž¬ãããããã«æ³šéãè¿œå ããå¿
èŠã¯ãªããšããããšã§ãã ãã®ããã圌ãã®æšè«ãã€ã€ã«ã¯ãTypeScriptãããã¯ããã«å¯å®¹ãªèšå®ã«ãªã£ãŠããŸãã
var x = new B(); x = new C();
ïŒBãšCã®äž¡æ¹ãAãã掟çããŠããïŒãã³ã³ãã€ã«ãããã¹ãã§ãããšããæåŸ
ã誰ããæã£ãŠãããã©ããã«ããã£ãŠããŸãã
B | C
ãšããŠæšæž¬ããå¿
èŠããããŸããTSã¯çŸåšïŒ1ïŒãå®è¡ããFlowã¯ïŒ3ïŒãå®è¡ããŸãã ç§ã¯ïŒ3ïŒãããïŒ1ïŒãšïŒ2ïŒã®æ¹ããã£ãšå¥œãã§ãã
å
ã®å·ã«@Arnavionã®äŸãè¿œå ãããã£ãã®ã§ãããå°ãéãã åŸãç§ãã¡ãç解ããŠãããã®ãããå¥åŠãªããšãããããšã«æ°ã¥ããŸããã
ãã®äŸã§ã¯ïŒ
var x = "5"; // x is inferred as string
x = 5; // x is infered as number now
x.toString(); // Compiles, since number has a toString method
x += 5; // Compiles since x is a number
console.log(x.length) // error x is a number
ä»ïŒ
var x = '';
if (true) {
x = 5;
}
ãã®äŸã®åŸãxã¯string | number
ãããŠç§ããããããªãïŒ
1. var x = '';
2. if (true) {
3. x = 5;
4. }
5. x*=5;
1è¡ç®ã§æ¬¡ã®ãããªãšã©ãŒãçºçããŸããïŒ myFile.js line 1 string this type is incompatible with myFile.js line 5 number
ç§ã¯ãŸã ããã§è«çãç解ããå¿ èŠããããŸã...ã
ç§ãå¿ããŠããæµãã«ã€ããŠã®èå³æ·±ãç¹ããããŸãïŒ
function test(t: Object) { }
test('string'); //error
åºæ¬çã«ããªããžã§ã¯ããã¯ä»ã®ããªããã£ãåãšäºææ§ããªãã®ã§ãæå³ããããšæããŸãã
ãæ±çšè§£å床ãã£ããã£ãã¯ãTSã«ãšã£ãŠééããªãå¿ é ã®æ©èœã§ãã
@fdecampredonã¯ãããã®éãã§ãã var x = "5"; x = 5;
xã®æšå®ã¿ã€ãã¯number
æŽæ°ãããŸãã 2çªç®ã®å²ãåœãŠã®åšãã«if (true) { }
è¿œå ãããšãã¿ã€ããã§ãã«ãŒã¯ã ãŸãããŠã©ã¡ããã®å²ãåœãŠãæå¹ã§ãããšæ³å®ããŸãããã®ãããæšæž¬ãããåã¯ä»£ããã«number | string
ã«æŽæ°ãããŸãã
number | string
ã¯*
æŒç®åããµããŒãããŠããªãããã myFile.js line 1 string this type is incompatible with myFile.js line 5 number
çºçãããšã©ãŒã¯æ£ããã§ãïŒå
±çšäœã¿ã€ãã§èš±å¯ãããæäœã¯ããã¹ãŠã®ã¿ã€ãã®ãã¹ãŠã®æäœã®å
±ééšåã®ã¿ã§ããé£åïŒã ããã確èªããã«ã¯ã x += 5
å€æŽãããšãã³ã³ãã€ã«ãããŸãã
ã³ã¡ã³ãã®äŸãæŽæ°ããŠã if (true)
ãæ±çšè§£å床ãã£ããã£ãã¯ãTSã«ãšã£ãŠééããªãå¿ é ã®æ©èœã§ãã
+1
@Arnavion ã B | C
ããã{}
ã奜ãçç±ãããããŸããã B | C
ãæšæž¬ãããšãåã·ã¹ãã ã®äžè¬çã«æãŸããããããã£ã§ããafaikã®æ£ç¢ºæ§ãæãªãããšãªããåãã§ãã¯ãè¡ãããã°ã©ã ã®ã»ãããåºãããŸãã
äŸ
declare function foo<T>(x:T, y: T): T;
var r = foo(1, "a"); // no problem, T is just string|number
ãã§ã«Tãé€ãçŸåšã®ã³ã³ãã€ã©ã®äžtypechecksã¯ããšæšå®ããã{}
ã§ã¯ãªãstring | number
ã ããã¯æ£ç¢ºããæãªããã®ã§ã¯ãããŸãããã倧ãŸãã«èšãã°ããŸã圹ã«ç«ã¡ãŸããã
Infering number | string
ã®ä»£ããã«{}
ç§ã«ã¯åé¡ãªãããã§ãã ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãæå¹ãªããã°ã©ã ã®ã»ãããæ¡åŒµãããŸããããåãæ§é ãå
±æããŠããå Žåãåã·ã¹ãã ã¯ãããèªèããããã€ãã®è¿œå ã®ã¡ãœãããããããã£ãæå¹ã«ããããšã¯æ¹åã®ããã«æããŸãã
B | C
æšæž¬ãããšãæ£ç¢ºæ§ãæãªãããšãªãã¿ã€ããã§ãã¯ããããã°ã©ã ã®ã»ãããåºãããŸã
æååãŸãã¯æ°å€ã®ããããã§+æäœãèš±å¯ãããšãæäœããŸã£ããé¡äŒŒããŠããªããããæ£ç¢ºæ§ãæãªããããšæããŸãã æäœãå ±éã®åºæ¬ã¯ã©ã¹ïŒç§ã®ãªãã·ã§ã³2ïŒã«å±ããŠããç¶æ³ãšã¯ç°ãªããŸãããã®å ŽåãããçšåºŠã®é¡äŒŒæ§ãæåŸ ã§ããŸãã
+æŒç®åã¯ãäºææ§ã®ãªã2ã€ã®ãªãŒããŒããŒããããããåŒã³åºãã§ããŸããã1ã€ã¯äž¡æ¹ã®åŒæ°ãæ°å€ã§ããã1ã€ã¯äž¡æ¹ãæååã§ãã B以æ¥| Cã¯æååãšæ°å€ã®äž¡æ¹ãããçããããã©ã¡ãã®ãªãŒããŒããŒãã§ãåŒæ°ãšããŠäœ¿çšã§ããŸããã
é¢æ°ãåŒæ°ã«å¯ŸããŠäºå€éã§ããå Žåãé€ããŠãããã¯åé¡ã«ãªãå¯èœæ§ããããŸããïŒ
var foo: string; console.log(foo + 5); console.log(foo + document);
ã³ã³ãã€ã«ãããã®ã§ãæåå+æŒç®åã¯å³åŽã§äœã§ãèš±å¯ããã®ã§ã string | number
ã¯æå¹ãªæäœãšããŠ+ <number>
ãæã€ããšã«ãªããŸãã ããããããªãã¯æ£ããã§ãïŒ
error TS2365: Operator '+' cannot be applied to types 'string | number' and 'number'.
å€ãã®ã³ã¡ã³ãã¯ããããŒå
ã®ã¿ã€ãã®èªåæ¡åŒµã«çŠç¹ãåœãŠãŠããŸãã ã©ã¡ãã®å Žåãã泚éãè¿œå ããããšã§ãå¿
èŠãªåäœãå®çŸã§ããŸãã TSã§ã¯ã宣èšã§æ瀺çã«æ¡åŒµããŸãïŒ var x: number|string = 5;
ããããŒã§ã¯ã宣èšã§å¶éããŸãïŒ var x: number = 5;
ã å宣èšãå¿
èŠãšããªãã±ãŒã¹ã¯ã人ã
ãæãé »ç¹ã«äœ¿çšããã±ãŒã¹ã ãšæããŸãã ç§ã®ãããžã§ã¯ãã§ã¯ã var x = 5; x = 'five';
ã¯å
±çšäœåããããšã©ãŒã«ãªãããšãå€ããšæããŸãã ã§ããããTSã¯ããã«ã€ããŠæ£ããæšè«ããããšæããŸãã
ç§ãæã䟡å€ããããšæããããŒæ©èœã«ã€ããŠã¯ïŒ
?string
ã§ã¯ãªããnull以å€ã®ä¿®é£Ÿåstring!
ãšããŠæ³åããŸãã ããã«ã¯3ã€ã®åé¡ããããŸããundefined
åŠçæ¹æ³mixed
ãšObject
éããObject.keys(3)
ãè©ŠããŠã¿ããšããšã©ãŒãçºçããŸãã ãããããšããžã±ãŒã¹ã¯å°ãªããšæãã®ã§ãããã¯éèŠã§ã¯ãããŸãããèªåå
±çšäœåæšè«ã«ã€ããŠïŒãåæšè«ãã¯å宣èšã«éå®ãããŠãããšæããŸãã çç¥ãããå宣èšãæé»çã«æšæž¬ããã¡ã«ããºã ã Goã®:=
ã«ã ç§ã¯åçè«å®¶ã§ã¯ãããŸããããç§ãç解ããŠããéããåæšè«ã¯ãå²ãåœãŠå
ã®åŒã®åããæšæž¬ãããããã¹ãŠã®æé»çãªå€æ°å®£èšïŒãŸãã¯é¢æ°ã®åŒæ°ïŒã«æ瀺çãªå泚éãè¿œå ããã³ã³ãã€ã©ãã¹ã§ãã ç§ã®ç¥ãéããããã¯ãããã©ã®ããã«æ©èœãããã§ã..ãŸã..ããã«ããä»ã®ãã¹ãŠã®åæšè«ã¡ã«ããºã ã CïŒãHaskellãGoããããã¯ãã¹ãŠãã®ããã«æ©èœããŸãã ãåŠãïŒ
å®éã®JSã«TSã»ãã³ãã£ã¯ã¹ãæ瀺ãããããšã«ã€ããŠã®è°è«ã¯ç解ããŠããŸããã代ããã«ãããã¯ä»ã®èšèªã«åŸãã®ã«ããããè¯ãç¹ã§ãã çµå±ã®ãšãããã¿ã€ãã¯JSãšTSã®å¯äžã®æ確ãªéãã§ãã
ç§ã¯Fluxã®ã¢ã€ãã¢ããããã奜ãã§ããããããå®éã«ãã®ããã«è¡ãããå Žåãããã¯å¥åŠãªããšã§ãã
null以å€ã®åã¯ãææ°ã®åã·ã¹ãã ã®å¿ é æ©èœã®ããã§ãã tsã«è¿œå ããã®ã¯ç°¡åã§ããããïŒ
ãã«äžå¯èœãªåãTSã«è¿œå ããããšã®è€éãã«ã€ããŠå°ãèªã¿ããå Žåã¯ã httpsïŒ//github.com/Microsoft/TypeScript/issues/185ãåç §ããŠ
èšããŸã§ããªããnull蚱容åã§ã¯ãªãã®ãšåããããçŽ æŽãããã®ã¯ãä»æ¥ã®äººæ°ã®ããèšèªã®å€§éšåã«ã¯ãããã©ã«ãã§null蚱容åïŒæ©èœãçã«åªããŠãããšããïŒãäžè¬åãããnull蚱容åæ©èœããŸã£ãããªãããšã§ãã ãããŠãè€éã§ãããéãã«å¯èœæ§ã®äŸ¡å€ã®å€ããããã©ã«ãã§ããããšã«ãããšããäºå®ã®ããã«ãäºåŸã«ãããè¿œå ããããšããïŒãŸãã¯æ£åžžã«è¿œå ããïŒäººã¯ã»ãšãã©ããŸããïŒäžå€æ§ãšåæ§ïŒã ããã¯ãããã§å¯èœæ§ãèæ ®ããŠããªããšããããšã§ã¯ãããŸããããå¿ é ã®æ©èœãšãã¯èšããŸããã
å®éãnull以å€ã®åãèŠéããŠããã®ãšåããããããããŒããèŠéããŠããæ¬åœã®æ©èœã¯ãžã§ããªãã¯ãã£ããã£ã§ããtsããã¹ãŠã®ãžã§ããªãã¯ã{}
解決ãããšããäºå®ã«ãããäžéšã®æ©èœæ§é ãç¹ã«ã«ãªãŒåã§ã®äœ¿çšãéåžžã«å°é£ã«ãªããŸãã
å人çã«ã¯ãäžè¬çãªãã£ããã£ãšéãã«å¯èœæ§ã¯ããããŒããã®_é«ã_å€ã®ã¿ãŒã²ããã§ãã ä»ã®ã¹ã¬ãããèªã¿ãŸãããããã«ã2cãå ¥ãããã£ãã®ã§ãã
éãã«å¯èœæ§ãè¿œå ããããšã®å©ç¹ã¯ãã»ãŒãã¹ãŠã®ã³ã¹ãã®äŸ¡å€ããããšæããããšããããŸãã ããã¯éåžžã«å¯èœæ§ã®é«ããšã©ãŒç¶æ ã§ãããããã©ã«ãã®nullå¯èœæ§ããããšãçµã¿èŸŒã¿ã®å€ã匱ãŸããŸãããTypeScriptã«ã¯ãã©ãã«ã§ããããšåçŽã«æ³å®ããŠnullå¯èœæ§ã«ã€ããŠè°è«ããæ©èœãããããŸããã
ããŒãããŒãã§nulläžå¯ãšããŠæ€åºã§ãããã¹ãŠã®å€æ°ã«æ³šéãä»ããŸãã
ãããŒã®ãµã€ãã«ã¯ææžåãããŠããªãããããŒã«ã¯ããªãå€ãã®é ãããæ©èœããããŸãã SuperTypeããŠã³ãã¿ã€ããšå®åã¿ã€ããå«ã
æãåèã«ãªãã³ã¡ã³ã
å人çã«ã¯ãäžè¬çãªãã£ããã£ãšéãã«å¯èœæ§ã¯ããããŒããã®_é«ã_å€ã®ã¿ãŒã²ããã§ãã ä»ã®ã¹ã¬ãããèªã¿ãŸãããããã«ã2cãå ¥ãããã£ãã®ã§ãã
éãã«å¯èœæ§ãè¿œå ããããšã®å©ç¹ã¯ãã»ãŒãã¹ãŠã®ã³ã¹ãã®äŸ¡å€ããããšæããããšããããŸãã ããã¯éåžžã«å¯èœæ§ã®é«ããšã©ãŒç¶æ ã§ãããããã©ã«ãã®nullå¯èœæ§ããããšãçµã¿èŸŒã¿ã®å€ã匱ãŸããŸãããTypeScriptã«ã¯ãã©ãã«ã§ããããšåçŽã«æ³å®ããŠnullå¯èœæ§ã«ã€ããŠè°è«ããæ©èœãããããŸããã
ããŒãããŒãã§nulläžå¯ãšããŠæ€åºã§ãããã¹ãŠã®å€æ°ã«æ³šéãä»ããŸãã