Typescript: Facebook Flow Type μ‹œμŠ€ν…œκ³Ό 비ꡐ

에 λ§Œλ“  2014λ…„ 11μ›” 25일  Β·  31μ½”λ©˜νŠΈ  Β·  좜처: microsoft/TypeScript

λ©΄μ±… μ‘°ν•­ :이 λ¬Έμ œλŠ” 흐름이 TypeScript보닀 λ‚«κ±°λ‚˜ λ‚˜μ˜λ‹€λŠ” 것을 증λͺ…ν•˜κΈ°μœ„ν•œ 것이 μ•„λ‹ˆλΌ 두 νŒ€μ˜ λ†€λΌμš΄ μž‘μ—…μ„ λΉ„νŒν•˜κ³  싢지 μ•Šμ§€λ§Œ Flow와 TypeScript μœ ν˜• μ‹œμŠ€ν…œ 의 차이점을 λ‚˜μ—΄ν•˜κ³  μ–΄λ–€ κΈ°λŠ₯을 ν‰κ°€ν•˜λ €κ³ ν•©λ‹ˆλ‹€. TypeScriptλ₯Ό κ°œμ„  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ λͺ©μ μ΄ TypeScriptλ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ λͺ…μ‹œλœ 것과 κ°™κΈ° λ•Œλ¬Έμ— Flowμ—μ„œ λˆ„λ½ 된 κΈ°λŠ₯에 λŒ€ν•΄μ„œλŠ” μ–ΈκΈ‰ν•˜μ§€ μ•Šκ² μŠ΅λ‹ˆλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œμ΄ ν•­λͺ©μ€ μ§€μ›λ˜λŠ” es6 / es7 κΈ°λŠ₯이 μ•„λ‹ˆλΌ μœ ν˜• μ‹œμŠ€ν…œ 에 κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€.

mixed 및 any

흐름 λ¬Έμ„œμ—μ„œ :

  • ν˜Όν•© : λͺ¨λ“  μœ ν˜•μ˜ "수퍼 νƒ€μž…". λͺ¨λ“  μœ ν˜•μ€ ν˜Όν•©μœΌλ‘œ 흐λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  • any : "동적"μœ ν˜•. λͺ¨λ“  μœ ν˜•μ€ μž„μ˜μ˜ μœ ν˜•μœΌλ‘œ, κ·Έ λ°˜λŒ€μ˜ κ²½μš°λ„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

기본적으둜 any λŠ” TypeScript any 와 λ™μΌν•˜κ³  mixed λŠ” TypeScript {} ν•©λ‹ˆλ‹€.

νλ¦„μ΄μžˆλŠ” Object μœ ν˜•

흐름 λ¬Έμ„œμ—μ„œ :

μ–΄λ–€ 것을 μ·¨ν•  μˆ˜μžˆλŠ” μœ„μΉ˜μ— 주석을 달렀면 mixedλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. λŒ€μ‹  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 의 상당 타이프 λŒ€ν•œ {} 그리고 μœ μ‚¬ν•œ λͺ¨λ“  μœ ν˜• 받아듀이도둝 number 번째 ν†΅ν™”μ˜ 경우 logObjectKeys(3) .
Flowλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ κΈ°λ³Έ μœ ν˜•μ΄ Object 와 ν˜Έν™˜λ˜μ§€ μ•ŠμœΌλ―€λ‘œ μœ ν˜• 검사기가 두 번째 호좜 logObjectKeys(3) 였λ₯˜λ₯Όλ³΄κ³ ν•©λ‹ˆλ‹€. _numberλŠ” Object_와 ν˜Έν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μœ ν˜•μ΄ 널이 μ•„λ‹™λ‹ˆλ‹€.

흐름 λ¬Έμ„œμ—μ„œ :

JavaScriptμ—μ„œ null은 μ•”μ‹œ 적으둜 λͺ¨λ“  κΈ°λ³Έ μœ ν˜•μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€. λ˜ν•œ λͺ¨λ“  개체 μœ ν˜•μ˜ μœ νš¨ν•œ κ±°μ£Όμžμž…λ‹ˆλ‹€.
λ°˜λŒ€λ‘œ FlowλŠ” null을 λ‹€λ₯Έ μœ ν˜•μ˜ 일뢀가 μ•„λ‹Œ 고유 ν•œ κ°’μœΌλ‘œ κ°„μ£Όν•©λ‹ˆλ‹€.

Flow doc μ„Ήμ…˜ μ°Έμ‘°

흐름 λ¬Έμ„œκ°€ κ½€ μ™„μ „ν•˜κΈ° λ•Œλ¬Έμ—μ΄ κΈ°λŠ₯을 μžμ„Ένžˆ μ„€λͺ…ν•˜μ§€λŠ” μ•Šκ² μŠ΅λ‹ˆλ‹€. κ°œλ°œμžκ°€ λͺ¨λ“  λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜κ±°λ‚˜ nullable둜 ν‘œμ‹œν•΄μ•Όν•œλ‹€λŠ” 점을 λͺ…μ‹¬ν•˜μ‹­μ‹œμ˜€.

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
}

ꡐ차둜 μœ ν˜•

Flow doc μ„Ήμ…˜ μ°Έμ‘°
ν•΄λ‹Ή 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>

μœ ν˜• μΆ”λ‘ 

일반적으둜 FlowλŠ” TypeScript보닀 더 λ§Žμ€ μœ ν˜•μ„ μΆ”λ‘ ν•˜λ €κ³ ν•©λ‹ˆλ‹€.

맀개 λ³€μˆ˜ μΆ”λ‘ 

이 예λ₯Ό μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

function logLength(obj) {
  console.log(obj.length);
}
logLength({length: 'hello'});
logLength([]);
logLength("hey");
logLength(3);

TypeScriptλ₯Ό μ‚¬μš©ν•˜λ©΄ 였λ₯˜κ°€λ³΄κ³ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. νλ¦„μ—μ„œ logLength 의 λ§ˆμ§€λ§‰ ν˜ΈμΆœμ€ number 에 length 속성이 μ—†κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ‚¬μš©λ²•μ— λ”°λ₯Έ μΆ”λ‘  된 μœ ν˜• λ³€κ²½

λͺ…μ‹œ 적으둜 λ³€μˆ˜λ₯Ό μž…λ ₯ν•˜μ§€ μ•ŠλŠ” ν•œ 흐름을 μ‚¬μš©ν•˜λ©΄μ΄ λ³€μˆ˜μ˜ μœ ν˜•μ΄μ΄ λ³€μˆ˜μ˜ μ‚¬μš©μ— 따라 λ³€κ²½λ©λ‹ˆλ‹€.

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 = 5 λ•Œλ¬Έμ— μ—λŸ¬ 초래 x 이전에 ν• λ‹Ή string 및 μœ ν˜• λ³€κ²½ν•  수 μ—†λ‹€.

Union μœ ν˜• μΆ”λ‘ 

또 λ‹€λ₯Έ 차이점은 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 λŠ” {} 와 λ™μΌν•˜λ―€λ‘œ 예λ₯Ό λ“€μ–΄ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
  • Object μœ ν˜•μ— λŒ€ν•œ μ„Ήμ…˜μ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μœ ν˜• 좔둠에 λŒ€ν•œ μΆ”κ°€ μ„Ήμ…˜

_ μžŠμ€ 것이 있으면 μ–Έμ œλ“ μ§€ μ•Œλ € μ£Όμ‹œλ©΄ μ—…λ°μ΄νŠΈλ₯Όν•˜κ² μŠ΅λ‹ˆλ‹€ ._

Question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

개인적으둜 일반적인 캑처 및 λΉ„ null κ°€λŠ₯성은 Flow의 _high_ κ°’ λŒ€μƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό 읽어 보 κ² μ§€λ§Œ 여기에 2c도 λ„£κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

λΉ„ nullability μΆ”κ°€μ˜ 이점은 거의 λͺ¨λ“  λΉ„μš©μ˜ κ°€μΉ˜κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ΄λŠ” 였λ₯˜ κ°€λŠ₯성이 맀우 높은 쑰건이며 κΈ°λ³Έ null ν—ˆμš© μ—¬λΆ€κ°€ ν˜„μž¬ κΈ°λ³Έ 제곡 값을 μ•½ν™”μ‹œν‚€λŠ” 반면 TypeScriptλŠ” λ‹¨μˆœνžˆ λͺ¨λ“  κ²½μš°μ— ν•΄λ‹Ήν•œλ‹€κ³  κ°€μ •ν•˜μ—¬ null ν—ˆμš© μ—¬λΆ€λ₯Ό λ…Όμ˜ ν•  μˆ˜μžˆλŠ” λŠ₯λ ₯이 λΆ€μ‘±ν•©λ‹ˆλ‹€.

ν•˜νŠΈ λΉ„νŠΈμ—μ„œ nullable이 μ•„λ‹Œ κ²ƒμœΌλ‘œ 찾을 μˆ˜μžˆλŠ” λͺ¨λ“  λ³€μˆ˜μ— 주석을 λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  31 λŒ“κΈ€

이것은 ν₯λ―Έλ‘­κ³  더 λ§Žμ€ ν† λ‘ μ„μœ„ν•œ 쒋은 μΆœλ°œμ μž…λ‹ˆλ‹€. λͺ…확성을 μœ„ν•΄ 원본 κ²Œμ‹œλ¬Όμ— 볡사 νŽΈμ§‘μ„ 변경해도 λ κΉŒμš”?

Flow의 μ˜ˆμƒμΉ˜ λͺ»ν•œ 사항 (μΆ”κ°€ 쑰사에 따라이 λŒ“κΈ€ μ—…λ°μ΄νŠΈ μ˜ˆμ •)

μ΄μƒν•œ ν•¨μˆ˜ 인수 μœ ν˜• μΆ”λ‘  :

/** 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) { }

Null 확인 μ•Œκ³ λ¦¬μ¦˜κ³Ό κ΄€λ ¨λœ λ²„κ·Έμ΄λ―€λ‘œλ³΄κ³ ν•˜κ² μŠ΅λ‹ˆλ‹€.

이닀

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의 {} 와 Flow의 mixed 사이에 λˆˆμ— λ„λŠ” 차이가 μžˆμŠ΅λ‹ˆκΉŒ?

@RyanCavanaugh λ‚˜λŠ” 그것이 μ—¬μ „νžˆ 그것에 λŒ€ν•΄ μƒκ°ν•˜λŠ” 것과 거의 λ™μΌν•˜λ‹€κ³  μƒκ°ν•œ 후에 μ •λ§λ‘œ λͺ¨λ₯Έλ‹€.

mixed μ—λŠ” 속성이 μ—†μŠ΅λ‹ˆλ‹€. {} Object.prototypeμ—μ„œ 상속 된 속성도 μ—†μŠ΅λ‹ˆλ‹€. (# 1108) 이것은 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

또 λ‹€λ₯Έ 차이점은 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 : μ•„λž˜ @fdecampredonμ—μ„œ μ§€μ ν–ˆλ“―μ΄ 두 번째 ν• λ‹Ή μ£Όλ³€μ˜ if (true) { } λŠ” Flowκ°€ μœ ν˜•μ„ string | number 둜 μΆ”λ‘ ν•˜λ„λ‘ν•΄μ•Όν•©λ‹ˆλ‹€. if (true) κ°€ μ—†μœΌλ©΄ λŒ€μ‹  number 둜 μΆ”λ‘ λ©λ‹ˆλ‹€.

이 행동이 λ§ˆμŒμ— λ“œμ‹­λ‹ˆκΉŒ? μš°λ¦¬λŠ” μœ λ‹ˆμ˜¨ μœ ν˜•μ— λŒ€ν•΄ λ…Όμ˜ ν•  λ•Œμ΄ 길을 κ°”κ³  κ·Έ κ°€μΉ˜λŠ” λͺ¨ν˜Έν–ˆμŠ΅λ‹ˆλ‹€. 이제 μœ ν˜• μ‹œμŠ€ν…œμ΄ μ—¬λŸ¬ κ°€λŠ₯ν•œ μƒνƒœλ‘œ μœ ν˜•μ„ λͺ¨λΈλ§ ν•  수 μžˆλ‹€κ³ ν•΄μ„œ λͺ¨λ“  κ³³μ—μ„œ μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. ν‘œλ©΄μ μœΌλ‘œλŠ” νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜ μž‘μ„±μ„ μ’‹μ•„ν•΄μ„œκ°€ μ•„λ‹ˆλΌ μ‹€μˆ˜ ν•  λ•Œ 컴파일러 였λ₯˜λ₯Ό μ›ν•˜κΈ° λ•Œλ¬Έμ— 정적 νƒ€μž… κ²€μ‚¬κΈ°κ°€μžˆλŠ” μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€.) 즉, λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄λŠ” 이와 같은 μ˜ˆμ œμ—μ„œ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€ (특히 두 번째) μœ ν˜• 곡간을 λͺ¨λΈλ§ν•˜λŠ” 방법이 λΆ€μ‘±ν•œ 것이 μ•„λ‹ˆλΌ μ‹€μ œλ‘œ 이것이 μ½”λ”© 였λ₯˜λΌκ³  λ―ΏκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€ (λΉ„μŠ·ν•œ 이유둜 λ§Žμ€ μ•”μ‹œ 적 캐슀트 / λ³€ν™˜ μž‘μ—…μ„ μ§€μ›ν•˜λŠ” λ§Žμ€ νšŒν”Ό).

λ™μΌν•œ 논리에 따라이 λ™μž‘μ„ κΈ°λŒ€ν•©λ‹ˆλ‹€.

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

기본적으둜 'Object'λŠ” λ‹€λ₯Έ κΈ°λ³Έ μœ ν˜•κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

'일반 해상도 캑처'λŠ” ν™•μ‹€νžˆ TS의 ν•„μˆ˜ κΈ°λŠ₯μž…λ‹ˆλ‹€!

@fdecampredon λ„€ λ§žμ•„μš”. var x = "5"; x = 5; x의 μΆ”λ‘  된 μœ ν˜•μ΄ number μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€. 두 번째 ν• λ‹Ή μ£Όμœ„μ— if (true) { } λ₯Ό μΆ”κ°€ν•˜λ©΄ typecheckerλŠ” 두 ν• λ‹Ή 쀑 ν•˜λ‚˜κ°€ μœ νš¨ν•˜λ‹€κ³  κ°€μ •ν•˜λ„λ‘ μ†μ—¬μ„œ μΆ”λ‘  된 μœ ν˜•μ΄ λŒ€μ‹  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 μΆ”λ‘ ν•˜λ©΄ 일반적으둜 μœ ν˜• μ‹œμŠ€ν…œμ˜ λ°”λžŒμ§ν•œ 속성 인 정확성을 μ†μƒμ‹œν‚€μ§€ μ•Šκ³  μœ ν˜• κ²€μ‚¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨ 집합이 ν™•μž₯λ©λ‹ˆλ‹€.

예

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)에 μ†ν•˜λŠ” μƒν™©κ³ΌλŠ” λ‹€λ¦…λ‹ˆλ‹€.이 경우 μœ μ‚¬μ„±μ„ κΈ°λŒ€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

+ μ—°μ‚°μžλŠ” 두 개의 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μ˜€λ²„λ‘œλ“œκ°€ 있기 λ•Œλ¬Έμ— 호좜 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. ν•˜λ‚˜λŠ” 두 μΈμˆ˜κ°€ 숫자이고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” λ‘˜ λ‹€ λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 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'.

λ§Žμ€ λŒ“κΈ€μ΄ Flowμ—μ„œ μœ ν˜•μ˜ μžλ™ ν™•μž₯에 μ΄ˆμ μ„ λ§žμΆ” μ—ˆμŠ΅λ‹ˆλ‹€. 두 경우 λͺ¨λ‘ 주석을 μΆ”κ°€ν•˜μ—¬ μ›ν•˜λŠ” λ™μž‘μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. TSμ—μ„œλŠ” μ„ μ–Έ : var x: number|string = 5; μ—μ„œ λͺ…μ‹œ 적으둜 ν™•μž₯ν•˜κ³  Flowμ—μ„œλŠ” μ„ μ–Έ : var x: number = 5; μ—μ„œ μ œν•œν•©λ‹ˆλ‹€. νƒ€μž… 선언이 ν•„μš”ν•˜μ§€ μ•Šμ€ κ²½μš°λŠ” μ‚¬λžŒλ“€μ΄ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” 경우 μ—¬μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œλŠ” var x = 5; x = 'five'; κ°€ 곡용체 μœ ν˜•λ³΄λ‹€ 더 자주 였λ₯˜κ°€ 될 κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” TSκ°€ 이것에 λŒ€ν•œ 좔둠을 가지고 μžˆλ‹€κ³  λ§ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ κ°€μΉ˜ μžˆλ‹€κ³  μƒκ°ν•˜λŠ” Flow κΈ°λŠ₯은?

  1. 널이 μ•„λ‹Œ μœ ν˜•
    λ‚˜λŠ” 이것이 버그λ₯Ό 쀄일 μˆ˜μžˆλŠ” 맀우 높은 잠재λ ₯을 가지고 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κΈ°μ‘΄ TS μ •μ˜μ™€μ˜ ν˜Έν™˜μ„±μ„ μœ„ν•΄ Flow의 nullable μˆ˜μ • 자 ?string λ³΄λ‹€λŠ” null이 μ•„λ‹Œ μˆ˜μ • 자 string! 둜 더 많이 μƒμƒν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것에 λŒ€ν•΄ μ„Έ 가지 문제λ₯Ό λ³Έλ‹€.
    클래슀 멀버 μ΄ˆκΈ°ν™”λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? _ (μ•„λ§ˆλ„ ctor에 ν• λ‹Ήλ˜μ–΄μ•Όν•˜λ©° ν• λ‹Ή 전에 ctorλ₯Ό μ΄μŠ€μΌ€μ΄ν”„ ν•  수 있으면 nullable둜 κ°„μ£Όλ©λ‹ˆλ‹€) _
    undefined 처리 방법? _ (FlowλŠ”μ΄ 문제λ₯Ό νšŒν”Όν•©λ‹ˆλ‹€.) _
    λ§Žμ€ λͺ…μ‹œ 적 μœ ν˜• 선언없이 μž‘λ™ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
  2. mixed 및 Object .
    C # κΈ°λ³Έ ν˜•μ‹κ³Ό 달리 κ°œμ²΄κ°€ κ°€λŠ₯ν•œ λͺ¨λ“  κ³³μ—μ„œ μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λΈŒλΌμš°μ €μ—μ„œ Object.keys(3) λ₯Ό μ‹œλ„ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 엣지 μΌ€μ΄μŠ€κ°€ 거의 μ—†λ‹€κ³  μƒκ°ν•˜λ―€λ‘œ 이것은 μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  3. 일반 해상도 캑처
    μ˜ˆλŠ” μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” κ·Έκ²ƒμœΌλ‘œλΆ€ν„° 이읡을 얻을 μˆ˜μžˆλŠ” λ§Žμ€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μžˆλ‹€κ³  말할 수 μ—†λ‹€. Underscore와 같은 κΈ°λŠ₯적 λΌμ΄λΈŒλŸ¬λ¦¬μ— 도움이 λ κΉŒμš”?

μžλ™ 톡합 μœ ν˜• μΆ”λ‘  : "μœ ν˜• μΆ”λ‘ "이 μœ ν˜• μ„ μ–ΈμœΌλ‘œ μ œν•œλœλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. μƒλž΅ 된 ν˜•μ‹ 선언을 μ•”μ‹œ 적으둜 μœ μΆ”ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μž…λ‹ˆλ‹€. Goμ—μ„œ := 처럼. λ‚˜λŠ” μœ ν˜• μ΄λ‘ κ°€λŠ” μ•„λ‹ˆμ§€λ§Œ λ‚΄κ°€ μ΄ν•΄ν•˜λŠ” ν•œ μœ ν˜• 좔둠은 ν• λ‹Ήλ˜λŠ” ν‘œν˜„μ‹μ˜ μœ ν˜•μ—μ„œ μœ μΆ” 된 λͺ¨λ“  μ•”μ‹œ 적 λ³€μˆ˜ μ„ μ–Έ (λ˜λŠ” ν•¨μˆ˜ 인수)에 λͺ…μ‹œ 적 μœ ν˜• 주석을 μΆ”κ°€ν•˜λŠ” 컴파일러 νŒ¨μŠ€μž…λ‹ˆλ‹€. λ‚΄κ°€ μ•„λŠ” ν•œ, 이것이 λ‹€λ₯Έ λͺ¨λ“  μœ ν˜•μ˜ μΆ”λ‘  λ©”μ»€λ‹ˆμ¦˜μ—μ„œ μž‘λ™ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. C #, Haskell, Go, λͺ¨λ‘μ΄ λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. μ•„λ‹ˆλ©΄?

λ‚˜λŠ” μ‹€μƒν™œμ˜ JSκ°€ TS μ˜λ―Έλ‘ μ„ μ‚¬μš©ν•˜λ„λ‘ ν—ˆμš©ν•˜λŠ” 것에 λŒ€ν•œ μ£Όμž₯을 μ΄ν•΄ν•˜μ§€λ§Œ, λŒ€μ‹  λ‹€λ₯Έ μ–Έμ–΄λ₯Ό λ”°λ₯΄λŠ” 것이 쒋은 점일 κ²ƒμž…λ‹ˆλ‹€. μœ ν˜•μ€ κ²°κ΅­ JS와 TS의 단일 μ •μ˜ μ°¨μ΄μ μž…λ‹ˆλ‹€.

μ €λŠ” Flux 아이디어λ₯Ό 많이 μ’‹μ•„ν•©λ‹ˆλ‹€.ν•˜μ§€λ§Œμ΄ 아이디어가 μ‹€μ œλ‘œ 이런 μ‹μœΌλ‘œ 이루어 μ‘Œλ‹€λ©΄ ... 그건 κ·Έλƒ₯ μ΄μƒν•©λ‹ˆλ‹€.

널이 μ•„λ‹Œ μœ ν˜•μ€ ν˜„λŒ€ μœ ν˜• μ‹œμŠ€ν…œμ˜ ν•„μˆ˜ κΈ°λŠ₯처럼 λ³΄μž…λ‹ˆλ‹€. TS에 μ‰½κ²Œ μΆ”κ°€ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

nullable이 μ•„λ‹Œ μœ ν˜•μ„ TS에 μΆ”κ°€ν•˜λŠ” λ³΅μž‘μ„±μ— λŒ€ν•œ κ°„λ‹¨ν•œ 읽기λ₯Ό μ›ν•œλ‹€λ©΄ https://github.com/Microsoft/TypeScript/issues/185λ₯Ό μ°Έμ‘°

Nullable이 μ•„λ‹Œ μœ ν˜•λ§ŒνΌ 쒋은 것은 μ˜€λŠ˜λ‚  널리 μ‚¬μš©λ˜λŠ” λŒ€λΆ€λΆ„μ˜ μ–Έμ–΄μ—λŠ” 기본적으둜 nullable이 μ•„λ‹Œ μœ ν˜• (κΈ°λŠ₯이 μ§„μ •μœΌλ‘œ λΉ›λ‚˜λŠ” κ³³)μ΄λ‚˜ μΌλ°˜ν™” 된 Nullable κΈ°λŠ₯이 μ „ν˜€ μ—†μŠ΅λ‹ˆλ‹€. 그리고 λ³΅μž‘μ„±κ³Ό non-nullability의 값이 κΈ°λ³Έκ°’ (λΆˆλ³€μ„±κ³Ό μœ μ‚¬)에 μžˆλ‹€λŠ” 사싀 λ•Œλ¬Έμ— 사싀 후에 μΆ”κ°€ (λ˜λŠ” μ„±κ³΅μ μœΌλ‘œ μΆ”κ°€)ν•˜λ €κ³  μ‹œλ„ν•œ μ‚¬λžŒμ€ 거의 μ—†μŠ΅λ‹ˆλ‹€. 이것은 μš°λ¦¬κ°€ μ—¬κΈ°μ„œ κ°€λŠ₯성을 κ³ λ €ν•˜κ³  μžˆμ§€ μ•Šλ‹€λŠ” 것을 μ˜λ―Έν•˜μ§€λŠ” μ•Šμ§€λ§Œ ν•„μˆ˜ κΈ°λŠ₯이라고 λΆ€λ₯΄μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

μ‹€μ œλ‘œ λ‚΄κ°€ null이 μ•„λ‹Œ μœ ν˜•μ„ λ†“μΉœλ§ŒνΌ, ν”Œλ‘œμš°μ—μ„œ λ†“μΉœ μ‹€μ œ κΈ°λŠ₯은 일반 μΊ‘μ²˜μž…λ‹ˆλ‹€. tsκ°€ λͺ¨λ“  μΌλ°˜μ„ {} ν•΄μ„ν•œλ‹€λŠ” 사싀은 일뢀 κΈ°λŠ₯ ꡬ쑰, 특히 컀링과 ν•¨κ»˜ μ‚¬μš©ν•˜κΈ°κ°€ 정말 μ–΄λ ΅κ²Œ λ§Œλ“­λ‹ˆλ‹€.

개인적으둜 일반적인 캑처 및 λΉ„ null κ°€λŠ₯성은 Flow의 _high_ κ°’ λŒ€μƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ μŠ€λ ˆλ“œλ₯Ό 읽어 보 κ² μ§€λ§Œ 여기에 2c도 λ„£κ³  μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€.

λΉ„ nullability μΆ”κ°€μ˜ 이점은 거의 λͺ¨λ“  λΉ„μš©μ˜ κ°€μΉ˜κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ΄λŠ” 였λ₯˜ κ°€λŠ₯성이 맀우 높은 쑰건이며 κΈ°λ³Έ null ν—ˆμš© μ—¬λΆ€κ°€ ν˜„μž¬ κΈ°λ³Έ 제곡 값을 μ•½ν™”μ‹œν‚€λŠ” 반면 TypeScriptλŠ” λ‹¨μˆœνžˆ λͺ¨λ“  κ²½μš°μ— ν•΄λ‹Ήν•œλ‹€κ³  κ°€μ •ν•˜μ—¬ null ν—ˆμš© μ—¬λΆ€λ₯Ό λ…Όμ˜ ν•  μˆ˜μžˆλŠ” λŠ₯λ ₯이 λΆ€μ‘±ν•©λ‹ˆλ‹€.

ν•˜νŠΈ λΉ„νŠΈμ—μ„œ nullable이 μ•„λ‹Œ κ²ƒμœΌλ‘œ 찾을 μˆ˜μžˆλŠ” λͺ¨λ“  λ³€μˆ˜μ— 주석을 λ‹¬μ•˜μŠ΅λ‹ˆλ‹€.

ν”Œλ‘œμš° μ‚¬μ΄νŠΈμ—λŠ” λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€ λ§Žμ€ μˆ¨κ²¨μ§„ κΈ°λŠ₯이 ν”Œλ‘œμš°μ— μžˆμŠ΅λ‹ˆλ‹€. SuperType 바인딩 및 쑴재 μœ ν˜• 포함

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

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰