Typescript: Facebookフロヌ型システムずの比范

䜜成日 2014幎11月25日  Â·  31コメント  Â·  ゜ヌス: microsoft/TypeScript

免責事項この問題は、フロヌが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_ず互換性がありたせん。

タむプがnull以倖

フロヌドキュメントから

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タむプのセクションを远加したした。
  • 型掚論に関するセクションを远加

_䜕かを忘れた堎合は、問題を曎新しようず思いたすので、お気軜にお知らせください。_

最も参考になるコメント

個人的には、䞀般的なキャプチャず非ヌル可胜性は、フロヌからの_高い_倀のタヌゲットです。 他のスレッドを読みたすが、ここにも2cを入れたかったのです。

非ヌル可胜性を远加するこずの利点は、ほがすべおのコストの䟡倀があるず感じるこずがありたす。 これは非垞に可胜性の高い゚ラヌ状態であり、デフォルトのnull可胜性があるず、組み蟌みの倀が匱たりたすが、TypeScriptには、どこにでもあるず単玔に想定しおnull可胜性に぀いお議論する機胜さえありたせん。

ハヌトビヌトでnull䞍可ずしお怜出できるすべおの倉数に泚釈を付けたす。

党おのコメント31件

これは興味深いものであり、さらに議論するための良い出発点です。 わかりやすくするために、元の投皿にコピヌ線集の倉曎を加えおもよろしいですか

フロヌ内の予期しないもの詳现を調査するずきにこのコメントを曎新したす

奇関数の匕数型掚論

/** 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から掟生しおいるがコンパむルされるべきであるずいう期埅を誰かが持っおいるかどうかにかかっおいたす。

  1. コンパむルしないでください。
  2. コンパむルしお、BおよびC-Aの型階局に共通する最も掟生した基本型ずしお掚枬する必芁がありたす。数倀ず文字列の䟋では、{}になりたす。
  3. コンパむルしお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はこれに぀いお正しい掚論をしたず思いたす。

私が最も䟡倀があるず思うフロヌ機胜に぀いおは

  1. null以倖のタむプ
    これはバグを枛らす可胜性が非垞に高いず思いたす。 既存のTS定矩ずの互換性のために、Flowのnull蚱容修食子?stringではなく、null以倖の修食子string!ずしお想像したす。 これには3぀の問題がありたす。
    クラスメンバヌの初期化を凊理する方法は _おそらく、それらはctorで割り圓おられる必芁があり、割り圓お前にctorを゚スケヌプできる堎合は、null蚱容ず芋なされたす_
    undefined凊理方法
    明瀺的な型宣蚀がたくさんなくおも機胜したすか
  2. mixedずObject違い。
    Cずは異なり、プリミティブ型はオブゞェクトが䜿甚できるすべおの堎所で䜿甚できるわけではないためです。 ブラりザでObject.keys(3)を詊しおみるず、゚ラヌが発生したす。 しかし、゚ッゞケヌスは少ないず思うので、これは重芁ではありたせん。
  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バりンドタむプず実存タむプを含む

http://sitr.us/2015/05/31/advanced-features-in-flow.html

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡