рдЕрд╕реНрд╡реАрдХрд░рдг: рдпрд╣ рдореБрджреНрджрд╛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлреНрд▓реЛрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдмреЗрд╣рддрд░ рдпрд╛ рдЦрд░рд╛рдм рд╣реИ, рдореИрдВ рджреЛрдиреЛрдВ рдЯреАрдо рдХреЗ рдЕрджреНрднреБрдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдлреНрд▓реЛ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдФрд░ рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдлреНрд▓реЛ рдореЗрдВ рдЕрдиреБрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдмреЛрд▓реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрджреНрджреЗрд╢реНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ рдпрд╣ рд╡рд┐рд╖рдп рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
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
рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдЕрдиреБрднрд╛рдЧредрдЕрдЧрд░ рдореБрдЭреЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рддреЛ рдореИрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред
рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реВрдБ?
рдлреНрд▓реЛ рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЪреАрдЬреЗрдВ (рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреА рдЕрдзрд┐рдХ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ)
рд╡рд┐рд╖рдо рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд╖реНрдХрд░реНрд╖:
/** 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 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ) рдХреЛ рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
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';
рдЕрдзрд┐рдХ рдмрд╛рд░ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЯреАрдПрд╕ рдХреЛ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХрд╛рд░ рдорд┐рд▓ рдЧрдпрд╛ред
рдлреНрд▓реЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИрдВ?
string!
рдмрдЬрд╛рдп рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдирд▓ рд╕рдВрд╢реЛрдзрдХ ?string
ред рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рддреАрди рдореБрджреНрджреЗ рджреЗрдЦрддрд╛ рд╣реВрдВ:undefined
рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ? _ (рдлреНрд▓реЛ рд╕рд╛рдЗрдб-рд╕реНрдЯреЗрдкреНрд╕ рдЗрд╕ рдЗрд╢реНрдпреВ) _mixed
рдФрд░ Object
рдмреАрдЪ рдЕрдВрддрд░редObject.keys(3)
рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрдврд╝рдд рдХреЗ рдорд╛рдорд▓реЗ рдХрдо рд╣реИрдВредрд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ "рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖" рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИред рдПрдХ рддрдВрддреНрд░ рдЬреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд▓реЛрдк рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕реЗ :=
рдЧреЛ рдореЗрдВред рдореИрдВ рдХреЛрдИ рдЯрд╛рдЗрдк рдереНрдпреЛрд░реАрд╡рд╛рджреА рдирд╣реАрдВ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБ, рдЯрд╛рдЗрдк рдЗрдиреНрд╡реЗрдВрд╢рди рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╛рд╕ рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╣рд┐рдд рдЪрд░ рдШреЛрд╖рдгрд╛ (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ) рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ .. рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ .. рд╣рд░ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рддрдВрддреНрд░ рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред рд╕реА #, рд╣рд╛рд╕реНрдХреЗрд▓, рдЧреЛ, рд╡реЗ рд╕рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╛ рдирд╣реАрдВ?
рдореИрдВ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдЬреЗрдПрд╕ рддрд╛рдирд╛рд╢рд╛рд╣ рдЯреАрдПрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рд╣реИред рдЬреЗрдПрд╕ рдФрд░ рдЯреАрдПрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЕрдВрддрд░ рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░ред
рдореБрдЭреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдлреНрд▓рдХреНрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ, рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рддреЛ рдпрд╣ рдЕрдЬреАрдм рд╣реИред
рдЖрдзреБрдирд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рдХреНрдпрд╛ ts рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛?
рдпрджрд┐ рдЖрдк TS рдореЗрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдкрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд╢ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ https://github.com/Microsoft/TypeScript/issues/185 рджреЗрдЦреЗрдВ
рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд, рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд рд╣реИрдВ рдЖрдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдЬрд╣рд╛рдВ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрдордХрддреА рд╣реИ) рдпрд╛ рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рдиреЗ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг рддрдереНрдп рдХреЗ рдмрд╛рдж (рдпрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛) рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХрд╛ рдЗрддрдирд╛ рдореВрд▓реНрдп рдЗрд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рд╕рдорд╛рди) рд╣реИред рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рддрдирд╛ рдореИрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реВрдВ, рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдореБрдЭреЗ рдпрд╛рдж рдЖрддреА рд╣реИ рдЬреЗрдиреЗрд░рд┐рдХ рдХреИрдкреНрдЪрд░, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдЬреЗрдиреЗрд░рд┐рдХ {}
рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд┐рд░реНрдорд╛рдг, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдХрдмреНрдЬрд╛ рдФрд░ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕реЗ _high_ рдореВрд▓реНрдп рд▓рдХреНрд╖реНрдп рд╣реИрдВред рдореИрдВ рджреВрд╕рд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдирд╛ 2 рд╕реА рднреА рдпрд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдореБрдЭреЗ рдХрднреА-рдХрднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд▓рд╛рдн рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХреАрдордд рдкрд░ рд╣реИред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╢рдХреНрддрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЕрднреА рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдмрд╕ рдпрд╣ рдорд╛рдирдХрд░ рдЕрд╢рдХреНрддрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред
рдореИрдВ рд╣рд░ рдЙрд╕ рдЪрд░ рдХрд╛ рдПрдиреЛрдЯреЗрдЯ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдореЗрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдХрд╛рдлреА рдЫрд┐рдкреА рд╣реБрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВред рдЬрд┐рд╕рдореЗрдВ рд╕реБрдкрд░ рдЯрд╛рдЗрдк рдмрд╛рдЙрдВрдб рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдХрдмреНрдЬрд╛ рдФрд░ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕реЗ _high_ рдореВрд▓реНрдп рд▓рдХреНрд╖реНрдп рд╣реИрдВред рдореИрдВ рджреВрд╕рд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдирд╛ 2 рд╕реА рднреА рдпрд╣реАрдВ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдореБрдЭреЗ рдХрднреА-рдХрднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрддрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд▓рд╛рдн рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдХреАрдордд рдкрд░ рд╣реИред рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╢рдХреНрддрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЕрднреА рдХрдордЬреЛрд░ рдХрд░рддрд╛ рд╣реИ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдмрд╕ рдпрд╣ рдорд╛рдирдХрд░ рдЕрд╢рдХреНрддрддрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред
рдореИрдВ рд╣рд░ рдЙрд╕ рдЪрд░ рдХрд╛ рдПрдиреЛрдЯреЗрдЯ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓ рдХреА рдзрдбрд╝рдХрди рдореЗрдВ рдЧреИрд░-рдЕрд╢рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред