Typescript: рдлреЗрд╕рдмреБрдХ рдлреНрд▓реЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдирд╡ре░ 2014  ┬╖  31рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

рдЕрд╕реНрд╡реАрдХрд░рдг: рдпрд╣ рдореБрджреНрджрд╛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлреНрд▓реЛрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдмреЗрд╣рддрд░ рдпрд╛ рдЦрд░рд╛рдм рд╣реИ, рдореИрдВ рджреЛрдиреЛрдВ рдЯреАрдо рдХреЗ рдЕрджреНрднреБрдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдлреНрд▓реЛ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдФрд░ рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдлреНрд▓реЛ рдореЗрдВ рдЕрдиреБрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмреЛрд▓реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрджреНрджреЗрд╢реНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╡рд┐рд╖рдп рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

mixed рдФрд░ any

рдкреНрд░рд╡рд╛рд╣ рдбреЙрдХреНрдЯрд░ рд╕реЗ:

  • рдорд┐рд╢реНрд░рд┐рдд: рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╕реБрдкрд░рдкрд╛рдЗрдк"ред рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдорд┐рд╢реНрд░рд┐рдд рдореЗрдВ рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдХрд┐рд╕реА рднреА: "рдЧрддрд┐рд╢реАрд▓" рдкреНрд░рдХрд╛рд░ред рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рдореЗрдВ рднреА рдкреНрд░рд╡рд╛рд╣рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд

рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рд╡рд╛рд╣ any рдХреЗ рдкреНрд░рдХрд╛рд░ TypeScript any рдФрд░ mixed рдХреЗ рдкреНрд░рдХрд╛рд░ TypeScript {} рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред

Object рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде

рдкреНрд░рд╡рд╛рд╣ рдбреЙрдХреНрдЯрд░ рд╕реЗ:

рдорд┐рд╢реНрд░рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ! рдпрд╣ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдм рдХреБрдЫ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреНрд░рд╛рдордХ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдк "рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ" рдХрд╛ рдЕрд░реНрде рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ "рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди" рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ Object {} рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рд╡рд╛рд╣ 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) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ Object рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдк-рдЪреЗрдХрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рджреВрд╕рд░реА рдХреЙрд▓ logObjectKeys(3) рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХрд░реЗрдЧрд╛: _number Object_ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред

рдкреНрд░рдХрд╛рд░ рдЧреИрд░-рдЕрд╢рдХреНрдд рд╣реИрдВ

рдкреНрд░рд╡рд╛рд╣ рдбреЙрдХреНрдЯрд░ рд╕реЗ:

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рд╢реВрдиреНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ; рдпрд╣ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡реИрдз рдирд┐рд╡рд╛рд╕реА рд╣реИред
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рд╡рд╛рд╣ рд╢реВрдиреНрдп рдХреЛ рдПрдХ рдЕрд▓рдЧ рдореВрд▓реНрдп рдорд╛рдирддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред

рдлреНрд▓реЛ рдбреЙрдХ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ

рдЪреВрдБрдХрд┐ рдлреНрд▓реЛ рдбреЙрдХ рдмрд╣реБрдд рдкреВрд░рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдлреАрдЪрд░ рдХреЛ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛, рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдордЬрдмреВрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╣рд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдпрд╛ рдЕрд╢рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЙрджрд╛рд╣рд░рдг:

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
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╡рд╛рд╣ рдЧреИрд░-рд╢реВрдиреНрдп рдЬрд╛рдВрдЪ рдХреЛ рд╕рдордЭреЗрдВ:

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
}

рдЕрдВрддрдГрдХрд░рдг рдкреНрд░рдХрд╛рд░

рдлреНрд▓реЛ рдбреЙрдХ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ
рдХреЙрд░рд╕реНрдкреЙрдиреНрдбрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╕реНрдпрд╛ # 1256 рджреЗрдЦреЗрдВ

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рд╡рд╛рд╣ рд╕рдорд░реНрдерди рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣, рдпрд╣ рд╕рдВрдпреЛрдЬрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ рдирдП рддрд░реАрдХреЗ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рдЕрдВрддрд░реНрдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ред
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде, рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рдкреНрд░рдХрд╛рд░ рдПрдХ рдорд┐рд╢реНрд░рдг рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ:

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

рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓реНрдк рдкрд░ рдХрдмреНрдЬрд╛

рдирд┐рдореНрди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

declare function promisify<A,B>(func: (a: A) => B):   (a: A) => Promise<B>;
declare function identity<A>(a: A):  A;

var promisifiedIdentity = promisify(identity);

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ promisifiedIdentity рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛:

(a: {}) => Promise<{}>`.

рдкреНрд░рд╡рд╛рд╣ promisifiedIdentity рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛:

<A>(a: A) => Promise<A>

рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди

рд╕рд╛рдорд╛рдиреНрдп рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░

рдЖрдЗрдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде, рдХреЛрдИ рднреА рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, 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 рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдШ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░

рдПрдХ рдФрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдлреНрд▓реЛ рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рдкреАрдЫреЗ рдХреА рдУрд░ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрдирдлрд░реНрдб рдЯрд╛рдЗрдк рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдШ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдлреЗрд╕рдмреБрдХ / рдкреНрд░рд╡рд╛рд╣ # 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 рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЕрдиреБрднрд╛рдЧред
  • рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдкрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЦрдВрдб

рдЕрдЧрд░ рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рддреЛ рдореИрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдХрдмреНрдЬрд╛ рдФрд░ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕реЗ _high_ рдореВрд▓реНрдп рд▓рдХреНрд╖реНрдп рд╣реИрдВред рдореИрдВ рджреВрд╕рд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдирд╛ 2 рд╕реА рднреА рдпрд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЭреЗ рдХрднреА-рдХрднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд▓рд╛рдн рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХреАрдордд рдкрд░ рд╣реИред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╢рдХреНрддрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЕрднреА рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдмрд╕ рдпрд╣ рдорд╛рдирдХрд░ рдЕрд╢рдХреНрддрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред

рдореИрдВ рд╣рд░ рдЙрд╕ рдЪрд░ рдХрд╛ рдПрдиреЛрдЯреЗрдЯ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдореЗрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА 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) { }

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реВрдБ?

рдмреЗрдЭрд┐рдЭрдХ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдореЗрдВ рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓реЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдирд┐рд╡реЗрд╢ рдХрд░рдирд╛ рд╣реИред

@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;

рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

@ рдбреЗрд╡рд┐рдбрд╕рдирд╕рди 90 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ:

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 рдореЗрдВ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЙрд▓ рдорд╛рдиреНрдп рд╣реИрдВред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ {} рдФрд░ mixed рдмреАрдЪ рдХреЛрдИ рднреА рдЕрд╡рд▓реЛрдХрди рдЕрдВрддрд░ рд╣реИ?

@RyanCavanaugh рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реИред

mixed рдкрд╛рд╕ рдХреЛрдИ рдЧреБрдг рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдирд╣реАрдВ рд╣реИрдВред рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ Object.prototyp рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ {} рдореЗрдВ (# 1108) рдпрд╣ рдЧрд▓рдд рд╣реИред

рдПрдХ рдФрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдлреНрд▓реЛ рдкреНрд░рдХрд╛рд░ рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рдкреАрдЫреЗ рдХреА рдУрд░ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрдирдлрд░реНрдб рдЯрд╛рдЗрдк рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдШ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдЙрджрд╛рд╣рд░рдг 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) { } рдХреЗ рд▓рд┐рдП 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 рдЬреИрд╕реА рдЪреАрдЬреЗрдВ)ред рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХрд╛ рддрд░реНрдХ рдЬреЗрдПрд╕ рдореЗрдВ рдирд╛рд╕рдордЭ рдмрд╛рддреЗрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрд╣реБрдордд рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ {} рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдереАрдВ, рдФрд░ рдЬрдм рддрдХ рдЖрдк рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП T рдХрд╛ рдПрдХ рдЪрд░ рдЪреБрдХрд╛ рдерд╛, рддрдм рддрдХ рдЖрдкрдХреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рдВрдШ рдкреНрд░рдХрд╛рд░) рдФрд░ рдлрд┐рд░ рдкреАрдЫреЗ рдХреА рдУрд░ рдЯреНрд░реЗрд╕ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╖реНрдЯрдкреНрд░рдж рдерд╛ред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХрднреА рднреА рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ (рдпрд╛ рдЯрд╛рдЗрдк рдЯреА рдХреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рдпрд╛ рд╣реИ) рддреЛ рдЖрдкрдиреЗ рд░рдирдЯрд╛рдЗрдо рддрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдХреБрдЫ рдЙрдбрд╝рд╛ (рдпрд╛ рдмреБрд░рд╛, рджреВрд╖рд┐рдд рдбреЗрдЯрд╛)ред рдЗрд╕реА рдкреНрд░рдХрд╛рд░:

declare function foo(arg: number);
var x = "5";
x = 5;
foo(x); // error

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ x рд╕реЗ foo рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рдЗрд╕реЗ рджреЛрдмрд╛рд░рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ x рдХрд╛ рдореВрд▓реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдерд╛? рдХрд┐рддрдиреА рдмрд╛рд░ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрд╕ рддрд░рд╣ рдХрд╛ рдкреБрди: рдЖрд░рдВрднреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ рдмрдирд╛рдо рдЧрд▓рддреА рд╕реЗ рдХрд┐рд╕реА рдЪреАрдЬ рдкрд░ рд╕реНрдЯрдВрдкрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, x рд▓рд┐рдП рдПрдХ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдХрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХрдо рд╕рдЦреНрдд рдерд╛ рдЕрдЧрд░ рдпрд╣ рдЕрднреА рднреА рдПрдХ (рдмрджрддрд░) рддреНрд░реБрдЯрд┐ рд╣реБрдИ? рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдХреЗрд╡рд▓ рдХрдо рд╕рдЦреНрдд рд╣реИ рдпрджрд┐ рдЖрдк рдХрднреА рднреА рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрдердХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИред

null рдФрд░ undefined рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЪрд░ рдФрд░ null рдорд╛рди рдЫрд┐рдкрд╛рдиреЗ рд╕реЗ рд▓реАрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рддреНрд░реБрдЯрд┐ред

рдлреНрд▓реЛ рдХреА рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рд╣реАрди рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЯрд╛рдЗрдкрд╕реЗрдХрд░ рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рдЕрд░реНрде рд░рдЦрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЯреАрдПрд╕ any ред рдЗрд╕рдХрд╛ рджрд░реНрд╢рди рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдЗрдВрдЯреНрд░реИрдХреНрд╢рди рдбрд╛рдпрд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдордд рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ var x = new B(); x = new C(); (рдЬрд╣рд╛рдВ B рдФрд░ C рджреЛрдиреЛрдВ A рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ) рдХреЛ рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

  1. рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмреА рдФрд░ рд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ {} рд╣реЛрдЧрд╛ред
  3. рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ B | C рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЯреАрдПрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ (1) рдФрд░ рдлреНрд▓реЛ рдХрд░рддрд╛ рд╣реИ (3)ред рдореИрдВ (1) рдФрд░ (2) рдХреЛ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ (3)ред

рдореИрдВ рдореВрд▓ рдореБрджреНрджреЗ рдкрд░ @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

рдореВрд▓ рд░реВрдк рд╕реЗ type рдСрдмреНрдЬреЗрдХреНрдЯ тАЩрдЕрдиреНрдп рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

'рдЬреЗрдиреЗрд░рд┐рдХ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреИрдкреНрдЪрд░' рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП!

@fdecampredon рд╣рд╛рдБ рдЖрдк рд╕рд╣реА рд╣реИрдВред var x = "5"; x = 5; x рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ number рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ if (true) { } рдЬреЛрдбрд╝рдХрд░, рдЯрд╛рдЗрдкрд░рд╛рдЗрдХрд░ рдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдореЗрдВ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдорд╛рдиреНрдп рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп number | string рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдкрдХреЛ myFile.js line 1 string this type is incompatible with myFile.js line 5 number рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ number | string * рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдиреБрдордд рдХрд╛рд░реНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╣реИрдВ рд╕рдВрдЧрдарди)ред рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ x += 5 рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕реЗ рд╕рдВрдХрд▓рди рджреЗрдЦреЗрдВрдЧреЗред

рдореИрдВрдиреЗ if (true) рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ

'рдЬреЗрдиреЗрд░рд┐рдХ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреИрдкреНрдЪрд░' рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯреАрдПрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП!

+1

@ рдЕрд░реНрдгрд╡рд┐рдпрди , рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк {} 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

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА, рд╡рд░реНрддрдорд╛рди рд╕рдВрдХрд▓рдХ рдХреЗ рддрд╣рдд typechecks рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЯреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ {} рдмрдЬрд╛рдп string | number ред рдпрд╣ рд╢реБрджреНрдзрддрд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЗрд╕рдХреЗ рдХрдо рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреА рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред

number | string рдмрдЬрд╛рдп {} рдХрд░рдирд╛ рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд▓рдЧрддрд╛ред рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╡реИрдз рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдЪреМрдбрд╝рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЛрдВ рдФрд░ / рдпрд╛ рдЧреБрдгреЛрдВ рдХреЛ рд╡реИрдз рдмрдирд╛рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реБрдзрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

B | C рд╕рдВрджрд░реНрдн рдЙрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдЪреМрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╢реБрджреНрдзрддрд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдкрд░ + рдСрдкрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЬреЛ рдпрд╛ рддреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕рд╣реАрддрд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдСрдкрд░реЗрд╢рди рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдСрдкрд░реЗрд╢рди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░ рд╡рд░реНрдЧ (рдореЗрд░рд╛ рд╡рд┐рдХрд▓реНрдк 2) рдкрд░ рд╣реЛрддрд╛ рд╣реИ - рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдХреБрдЫ рд╕рдорд╛рдирддрд╛ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

+ рдСрдкрд░реЗрдЯрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рджреЛ рдЕрд╕рдВрдЧрдд рдЕрдзрд┐рднрд╛рд░ рд╣реЛрдВрдЧреЗ - рдПрдХ рдЬрд╣рд╛рдВ рджреЛрдиреЛрдВ рддрд░реНрдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдПрдХ рдЬрд╣рд╛рдВ рджреЛрдиреЛрдВ рддрд╛рд░ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдмреА | 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'; рдЕрдзрд┐рдХ рдмрд╛рд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЯреАрдПрд╕ рдХреЛ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХрд╛рд░ рдорд┐рд▓ рдЧрдпрд╛ред

рдлреНрд▓реЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИрдВ?

  1. рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░
    рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреАрдбрд╝реЗ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛ рд╣реИред рдореМрдЬреВрджрд╛ рдЯреА рдПрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╕рдВрд╢реЛрдзрдХ рдХрд▓реНрдкрдирд╛ string! рдмрдЬрд╛рдп рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдирд▓ рд╕рдВрд╢реЛрдзрдХ ?string ред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рддреАрди рдореБрджреНрджреЗ рджреЗрдЦрддрд╛ рд╣реВрдВ:
    рдХрдХреНрд╖рд╛ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдП? _ (рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ ctor рдореЗрдВ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╡реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ ctor рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд╢рдХреНрдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) _
    undefined рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ? _ (рдлреНрд▓реЛ рд╕рд╛рдЗрдб-рд╕реНрдЯреЗрдкреНрд╕ рдЗрд╕ рдЗрд╢реНрдпреВ) _
    рдХреНрдпрд╛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╣реБрдд рд╕рд╛рд░реА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
  2. mixed рдФрд░ Object рдмреАрдЪ рдЕрдВрддрд░ред
    рдХреНрдпреЛрдВрдХрд┐ C # рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣рд░ рдЬрдЧрд╣ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ Object.keys(3) рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдврд╝рдд рдХреЗ рдорд╛рдорд▓реЗ рдХрдо рд╣реИрдВред
  3. рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдХрд▓реНрдк рдкрд░ рдХрдмреНрдЬрд╛
    рдЙрджрд╛рд╣рд░рдг рд╕рд┐рд░реНрдл рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВ рдмрд╣реБрдд рд╕реЗ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред рд╢рд╛рдпрдж рдпрд╣ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧрд╛?

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ "рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖" рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИред рдПрдХ рддрдВрддреНрд░ рдЬреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓реЛрдк рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ := рдЧреЛ рдореЗрдВред рдореИрдВ рдХреЛрдИ рдЯрд╛рдЗрдк рдереНрдпреЛрд░реАрд╡рд╛рджреА рдирд╣реАрдВ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ, рдЯрд╛рдЗрдк рдЗрдиреНрд╡реЗрдВрд╢рди рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд╕ рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╣рд┐рдд рдЪрд░ рдШреЛрд╖рдгрд╛ (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ) рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ .. рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ .. рд╣рд░ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рддрдВрддреНрд░ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред рд╕реА #, рд╣рд╛рд╕реНрдХреЗрд▓, рдЧреЛ, рд╡реЗ рд╕рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╛ рдирд╣реАрдВ?

рдореИрдВ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЬреЗрдПрд╕ рддрд╛рдирд╛рд╢рд╛рд╣ рдЯреАрдПрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рд╣реИред рдЬреЗрдПрд╕ рдФрд░ рдЯреАрдПрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░ред

рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлреНрд▓рдХреНрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ, рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рддреЛ рдпрд╣ рдЕрдЬреАрдм рд╣реИред

рдЖрдзреБрдирд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рдХреНрдпрд╛ ts рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛?

рдпрджрд┐ рдЖрдк TS рдореЗрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ https://github.com/Microsoft/TypeScript/issues/185 рджреЗрдЦреЗрдВ

рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд, рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рд╣реИрдВ рдЖрдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдЬрд╣рд╛рдВ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрдордХрддреА рд╣реИ) рдпрд╛ рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рдиреЗ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рддрдереНрдп рдХреЗ рдмрд╛рдж (рдпрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХрд╛ рдЗрддрдирд╛ рдореВрд▓реНрдп рдЗрд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд╕рдорд╛рди) рд╣реИред рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рддрдирд╛ рдореИрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ, рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореБрдЭреЗ рдпрд╛рдж рдЖрддреА рд╣реИ рдЬреЗрдиреЗрд░рд┐рдХ рдХреИрдкреНрдЪрд░, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдЬреЗрдиреЗрд░рд┐рдХ {} рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд┐рд░реНрдорд╛рдг, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдХрдмреНрдЬрд╛ рдФрд░ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕реЗ _high_ рдореВрд▓реНрдп рд▓рдХреНрд╖реНрдп рд╣реИрдВред рдореИрдВ рджреВрд╕рд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдирд╛ 2 рд╕реА рднреА рдпрд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЭреЗ рдХрднреА-рдХрднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд▓рд╛рдн рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХреАрдордд рдкрд░ рд╣реИред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╢рдХреНрддрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЕрднреА рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдмрд╕ рдпрд╣ рдорд╛рдирдХрд░ рдЕрд╢рдХреНрддрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред

рдореИрдВ рд╣рд░ рдЙрд╕ рдЪрд░ рдХрд╛ рдПрдиреЛрдЯреЗрдЯ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдореЗрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдХрд╛рдлреА рдЫрд┐рдкреА рд╣реБрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВред рдЬрд┐рд╕рдореЗрдВ рд╕реБрдкрд░ рдЯрд╛рдЗрдк рдмрд╛рдЙрдВрдб рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

uber5001 picture uber5001  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MartynasZilinskas picture MartynasZilinskas  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

weswigham picture weswigham  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bgrieder picture bgrieder  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Antony-Jones picture Antony-Jones  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ