рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ: npm install yortus-typescript-typeof
рдЕрдВрддрд░ рджреЗрдЦреЗрдВ: рдпрд╣рд╛рдБ ред
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдРрд╕реА рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рдВрдХрд▓рдХ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:
// Mapping to a complex anonymous type. How to reference the element type?
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
function checkItem(item: typeof data[0] /* ERROR */) {...}
// A statically-typed dictionary. How to reference a property type?
var things = { 'thing-1': 'baz', 'thing-2': 42, ... };
type Thing2Type = typeof things['thing-2']; // ERROR
// A strongly-typed collection with special indexer syntax. How to reference the element type?
var nodes = document.getElementsByTagName('li');
type ItemType = typeof nodes.item(0); // ERROR
// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
class MyAPI {
constructor(http) {...}
foo() {...}
bar() {...}
static id = id;
}
return new MyAPI($http);
}
function augmentAPI(api: MyAPI /* ERROR */) {...}
// Declare an interface DRY-ly and without introducing extra type names
interface MyInterface {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
},
// prop2 shares some structure with prop1
prop2: typeof MyInterface.prop1.big.complex; // ERROR
}
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рд╣рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ any
рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдбрдореА рд╡реИрд░рд┐рдПрдмрд▓ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ (рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд░рдирдЯрд╛рдЗрдо рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдмрд╕ рдЕрдиреБрдорд╛рди рдЯрд╛рдЗрдк рдХрд░реЗрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
let dummyReturnVal = null && someFunction(0, ''); // NB: someFunction is never called!
let ReturnType = typeof dummyReturnVal; // Now we have a reference to the return type
рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:
dummyReturnValue
рдЬреИрд╕реЗ рдЪрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП)_(рдПрдирдмреА: рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рд╣реА #4233 рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рдореБрджреНрджреЗ рдХреЛ 'рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ' рдЯреИрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрдИ рдЕрдиреНрдп рдирд┐рдХрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рд╣реИред)_
typeof
рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рджреЗрдВред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА typeof expr
рдХреЗ рд▓рд┐рдП if (typeof foo() === 'string')
рдЬреИрд╕реА рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдиреБрдордд рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдордирдорд╛рдирд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддрд╛ рд╣реИ рдЬрдм typeof
рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП type ElemType = typeof list[0]
ред
рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд▓реНрдкрдирд╛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ:
рдЯрд╛рдЗрдк рдХреНрд╡реЗрд╢реНрдЪрди рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдЬреИрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд┐рдЯрд░рд▓, рдлрдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдФрд░ рдиреЗрдорд╕реНрдкреЗрд╕ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
рддреЛ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗрд╡рд▓ рдЙрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддрд░рд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕реЗрд╡рд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рддрдХ рдмрдврд╝рд╛ рд░рд╣рд╛ рд╣реИред
рд╢рдмреНрджрд╛рд░реНрде рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 4.18.6 рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
'рдЯрд╛рдЗрдкреЛрдлрд╝' рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрдВрдб рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА (рдЦрдВрдб 3.8.10) рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рдЯрд╛рдЗрдкреЛрдлрд╝' рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрдВрддрд░ рдиреАрдЪреЗ рдЙрджреНрдзреГрдд рдЦрдВрдб 3.8.10 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬрд╣рд╛рдВ рд╣рд┐рдЯ-рдереНрд░реВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмреЛрд▓реНрдб рдЯреЗрдХреНрд╕реНрдЯ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛:
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ рдХреАрд╡рд░реНрдб рдЯрд╛рдЗрдкрдСрдлрд╝ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж
рдПрдХ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реЛрддрд╛ рд╣реИредрдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдзрд╛рд░рд╛ 4.3) рдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдкрд╣реБрдВрдЪ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдЕрдиреБрднрд╛рдЧ 4.13)рдПрдХ рдпреВрдирд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рдХрд╛рд░ (рдзрд╛рд░рд╛ 3.12) рдкрд░рд┐рдгрд╛рдо рдмрди рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреНрдп рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рдорд╛рди, рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╕реЗ рдЯрд╛рдЗрдк рдХреНрд╡реЗрд╢реНрдЪрди рдорд┐рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рд░рди-рдЯрд╛рдЗрдо рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдмрд┐рдВрджреБ рдЬрд┐рд╕ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рднреА рдерд╛ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рд╛) рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрди рдЙрдирдХреЗ рдСрдкрд░реЗрдВрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдЪ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд░рд╣реЗрдЧрд╛ред
рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рднреА рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ typeof
рдХреЛ рдЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХрдо рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИред
// Mapping to a complex anonymous type. How to reference the element type?
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
function checkItem(item: typeof data[0]) {...} // OK: item type is {raw:number, square:number}
// A statically-typed dictionary. How to reference a property type?
var things = { 'thing-1': 'baz', 'thing-2': 42, ... };
type Thing2Type = typeof things['thing-2']; // OK: Thing2Type is number
// A strongly-typed collection with special indexer syntax. How to reference the element type?
var nodes = document.getElementsByTagName('li');
type ItemType = typeof nodes.item(0); // OK: ItemType is HTMLLIElement
// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
class MyAPI {
constructor(http) {...}
foo() {...}
bar() {...}
static id = id;
}
return new MyAPI($http);
}
type MyAPI = typeof myAPIFactory(null, 0); // OK: MyAPI is myAPIFactory's return type
function augmentAPI(api: MyAPI) {...} // OK
// Declare an interface DRY-ly and without introducing extra type names
interface MyInterface {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
},
// prop2 shares some structure with prop1
prop2: typeof (<MyInterface>null).prop1.big.complex; // OK: prop2 type is {anonymous: {type: {}}}
}
рд╡рд┐рд░реБрджреНрдз : рдЦрд░рд╛рдм рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ред #6179, #6239, #4555 рдФрд░ #4640 рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреЗ рд▓рд┐рдП : рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЙрдирдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрди рд╕рднреА рдореБрджреНрджреЛрдВ рдореЗрдВ рдЙрдард╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреЛрдИ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реАрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╡рд┐рд░реБрджреНрдз : рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реНрдпрдВрдЬрдХ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрддрд╛ рд╣реИред
рдХреЗ рд▓рд┐рдП : рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рдЕрд░реНрдереЛрдВ рдХреЗ рд╕рд╛рде typeof
рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЙрдард╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХреЗред
рд╡рд┐рд░реБрджреНрдз : рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╡рд┐рд╢рд╛рд▓ рд▓рдВрдмреА рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЗ рд▓рд┐рдП : рдЯрд╛рдЗрдк рдХреНрд╡реЗрд░реА рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдорд╛рд░реНрдЯрд┐рди рдлрд╛рдЙрд▓рд░ рдХреА рд╕рдХреНрд╖рдорддрд╛ рдмрдирд╛рдо рдирд┐рд░реНрджреЗрд╢рди рд╣реИред
рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдкрд┐рдЫрдбрд╝рд╛-рд╕рдВрдЧрдд рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рд╕рднреА рдореМрдЬреВрджрд╛ рдХреЛрдб рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВред typeof
рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдСрдкреНрдЯ-рдЗрди рд╣реИред
рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рд╛рдордиреЗ рд░рдЦрддрд╛ рд╣реИред рдореИрдВ рдирдЧрдгреНрдп рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реАрдПрд╕ рдХреЛрдб рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рд╣реИ, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЗрд╕рдХреА рднрд╛рд╖рд╛ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рд╕рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдФрд░ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдирд┐рд░реНрджреЛрд╖ рд╣реИрдВред
.d.ts
рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВtypeof
рдХрд╛ рдСрдкрд░реЗрдВрдб рдХреЛрдИ рднреА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдИрдЖрдИрдПрдлрдИ, рдпрд╛ рдореЗрдердб рдмреЙрдбреАрдЬ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдХреНрд▓рд╛рд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореИрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛, рдпрд╣ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдВрджрд░ рднреА рдПрдХ .d.ts
рдлрд╝рд╛рдЗрд▓ ( typeof
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рдЙрдкрдпреЛрдЧреА рд╣реИ - рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ)ред рддреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ "рдХрдерди рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ" рдЕрдм рд╕рдЦреНрддреА рд╕реЗ рд╕рдЪ рдирд╣реАрдВ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рддрд░реНрдХ рд╣реИрдВ:
function foo<X,Y>(x: X, y: Y) {
var result: typeof foo(x, y); // ERROR: 'result' is referenced in its own type annotation
return result;
}
рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдЪреБрдирддрд╛ рд╣реИ рдЬреЛ рдХреНрд╡реЗрд░реА рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:
declare function foo(a: boolean): string;
declare function foo(a: number): any[];
type P = typeof foo(0); // P is any[]
type Q = typeof foo(true); // Q is string
рд╡реАрдПрд╕ рдХреЛрдб рдореЗрдВ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рддреНрд╡рд░рд┐рдд рддрд░реАрдХрд╛ рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд░реЗрдкреЛ рд╣реИ ред
рдЯрд╛рдЗрдк рдкреА = рдЯрд╛рдЗрдкреЛрдл рдлреВ (0); // рдкреА рдХреЛрдИ рд╣реИ []
рдЯрд╛рдЗрдк рдХреНрдпреВ = рдЯрд╛рдЗрдкреЛрдлрд╝ рдлреВ (рд╕рдЪ); // рдХреНрдпреВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдзрд┐рдХ рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред
type P = typeof foo(number); // P is any[]
type Q = typeof foo(boolean); // Q is string
рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдорд╛рди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВред рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдХрдо рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреБрдЫ рд▓реЛрдЧ typeof foo(false)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдХреБрдЫ рд▓реЛрдЧ typeof foo(true)
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рддреЛ рд▓реЛрдЧ рдХреЗрд╡рд▓ typeof foo(boolean)
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
@tinganho рдмрд┐рд▓реНрдХреБрд▓!
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЕрднреА рднреА #5185 . рдХреЗ рд╕рд╛рде typeof foo("abc")
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдпрд╣рд╛рдБ "abc"
рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ
@tinganho рдореИрдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдкрд╕рдВрдж рд╣реИрдВ, рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рдЕрдЪреНрдЫрд╛ рд╣реИ (рд╕рд░рд▓ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдХрдо рдЕрд╕реНрдкрд╖реНрдЯ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рдХрдо рджрд┐рдЦрддрд╛ рд╣реИ)ред рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдЪреАрдЬ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рдЙрдкрдиреНрдпрд╛рд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╛рд░реНрд╕рд░/рдЪреЗрдХрд░ рдореЗрдВ рдХреЛрдИ рдЬрдЯрд┐рд▓рддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдирд╣реАрдВ рд╣реИрдВред
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЗ foo(number)
рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдпрд╛рдВрддреНрд░рд┐рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛? рддреЛ рдПрдХ рдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдирдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрд╢ рдХреА рд╣реИ: _unary as_. рдЖрдк рдмрд╕ as T
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ (null as T)
рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реИред рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, _'рдореБрдЭреЗ рдореВрд▓реНрдп рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ X'_ рд╣реЛред
рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде (рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рд░реЗрдкреЛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ), рдЖрдк рдЕрдкрдиреЗ рд╕реБрдЭрд╛рдП рдЧрдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
type P = typeof foo(as number); // P is any[]
type Q = typeof foo(as boolean); // Q is string
let prop2: typeof (as MyInterface).prop1.big.complex; // prop2 type is {anonymous: {type: {}}}
рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рддреНрд╡рд░рд┐рдд рдкреНрд░рдпреЛрдЧ рдерд╛ред рдПрдХ рд╕рдордХрдХреНрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ):
type P = typeof foo(<number>); // P is any[]
type Q = typeof foo(<boolean>); // Q is string
let prop2: typeof (<MyInterface>).prop1.big.complex; // prop2 type is {anonymous: {type: {}}}
рджреВрд╕рд░реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ _nullary рдкреНрд░рдХрд╛рд░ рдХрд╛ рджрд╛рд╡рд╛_ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ <T>
(<T> null)
рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╣реИред
@yortus , рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ 1 рдереАред рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рдкрд╕реА рдпрд╛ рд╡рд░реНрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд╛рд░ред рдФрд░ 2. рдЯрд╛рдЗрдк рдкреЛрдЬреАрд╢рди рдореЗрдВ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдХреЛрдИ рдРрд╕реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рд╣рдЬ рд╣реЛрдВред
@tinganho рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╣ рдерд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рднреА рдмрд╛рдд рдХреА рдереАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рд╛рдпрдж рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред рдПрдХ рдирдпрд╛ рдпреВрдирд░реА рдСрдкрд░реЗрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рдХрд╛рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рдЖрдЬ рд╕реНрд▓реЙрдЧ рдореЗрдВ рдХрд╛рдлреА рджреЗрд░ рддрдХ рдЪрд░реНрдЪрд╛ рд╣реБрдИред "рдкреАрдЖрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛" рдпрд╣рд╛рдБ рд╣реИ "рдкреАрдЖрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдкрд╛рдЧрд▓ рдирд╣реАрдВ рд╣реИ"
@tinganho рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖) рдФрд░ рд╣рдо рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреАрдЖрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдореБрд╢реНрдХрд┐рд▓ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо f(number)
рдмрдирд╛рдо f(0)
рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреЛрдбрдкрде рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХ-рдЗрди рд╣реИ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рде рдХрд┐ рдпрд╣ _types_ рдХреЗ рд╕реЗрдЯ рдХреЗ рдмрдЬрд╛рдп _expressions_ рдХреЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдереЛрдбрд╝реА рд╕реА рдЪрд╛рд▓рдмрд╛рдЬреА рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реАрдзрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд▓реЗ рдХреА рдореВрд▓ рдпреЛрдЬрдирд╛ рд╣реЛрдЧреА:
typeof
рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕реЗрдб рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХреЗредparseType
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдПрдХ TypeNode
рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЛрдб рдкрд░ рдПрдХ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░реЗрдВ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдерд╛checkExpression
рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрдЬрд╛рдп getTypeFromTypeNode
рдкрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ@mhegazy , @RyanCavanaugh рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреАрдо рдиреЗ рдХрд┐рддрдиреЗ рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рддреЛ рдХреНрдпрд╛ рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВ? рдореИрдВрдиреЗ рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рд░ рдПрдХ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ typeof
рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рдВрджрд┐рдЧреНрдз рдорд╛рдорд▓реЛрдВ рдкрд░ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрдиреЛрдВ рдХреЗ рд╕рд╛рдеред
var data = [1, 2, 3];
const LOBOUND = 0;
type Elem1 = typeof data[0]; // number
type Elem2 = typeof data[999999]; // number or ERROR?
type Elem3 = typeof data[1+2]; // ERROR or number?
type Elem4 = typeof data[LOBOUND]; // ERROR or number?
var tuple: [number, string] = [123, 'abc'];
type Elem4 = typeof tuple[0]; // number or number|string?
type Elem5 = typeof tuple[1]; // string or number|string?
type Elem6 = typeof tuple[999999]; // number|string or ERROR?
const ABC: 'a-b-c' = 'a-b-c';
let dict = { 'a-b-c': 123, 'd-e-f': true };
type Prop1 = typeof dict['a-b-c']; // number
type Prop2 = typeof dict['d-e-f']; // boolean
type Prop3 = typeof dict[ABC]; // ERROR or number or any?
// A simple function
declare function f1(n: number): string[];
type Ret1 = typeof f1(number); // string[]
type Ret2 = typeof f1(0); // ERROR or string[]?
// An asynchronous function that either accepts a callback or returns a Promise
declare function f2(n: number): Promise<string[]>;
declare function f2(n: number, cb: (err?: any, result?: string[]) => void): void;
type Ret3 = typeof f2(number); // Promise<string[]>
type Ret4 = typeof f2(number, any); // void
type Ret5 = typeof f2(number, Function); // ERROR: Function not assignable to callback
type Ret6 = typeof f2(number, (err: any, result: string[]) => void); // void
type Ret7 = typeof f2(number, (...args) => any); // void
// A special function-like object
interface Receiver {
(data: string[]): void;
transmogrify(): number[];
}
declare function f3(n: number, receiver: Receiver): Promise<void>;
declare function f3(n: number, callback: (err?: any, result?: string[]) => void): void;
type Ret8 = typeof f3(number, Receiver); // Promise<void>
type Ret9 = typeof f3(number, any); // ambiguous? or picks first overload?
type Ret10 = typeof f3(number, Function); // ERROR
type Ret11 = typeof f3(number, (...args) => any); // void since not assignable to Receiver
// A function with parameter destructuring
interface CartesianCoordinate {/***/}
interface PolarCoordinate {/***/}
declare function f4({ x: number, y: number }): CartesianCoordinate;
declare function f4({ r: number, t: number }): PolarCoordinate;
type Ret12 = typeof f4(any); // ambiguous? or picks first overload?
type Ret13 = typeof f4({x;y}); // CartesianCoordinate
type Ret14 = typeof f4({r;t}); // PolarCoordinate
type Ret15 = typeof f4({x;r;t;y}); // ambiguous? or picks first overload?
// Type-ception: is there anything wrong with typeof-in-typeof?
declare function f5(n: number, receiver: Receiver): Promise<void>;
declare function f5(n: number, callback: (err?: any, result?: string[]) => void): void;
function myCallback(err, result) {/***/}
var myReceiver: Receiver;
type Ret16 = typeof f5(number, typeof myReceiver); // Promise<void>
type Ret17 = typeof f5(number, typeof myCallback); // void
рдпрд╛рдиреА, рдКрдкрд░ рджрд┐рдП рдЧрдП typeof (<MyInterface> null).prop1.big.complex;
рдЙрджрд╛рд╣рд░рдгред
рдореИрдВ рдЗрд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд▓реЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рд╡реЛ рд╕рд╣реА рд╣реИ?
var data = [1, 2, 3];
const LOBOUND = 0;
type Elem1 = typeof data[0]; // number
type Elem2 = typeof data[999999]; // number
type Elem3 = typeof data[1+2]; // ERROR, only literals allowed here
type Elem4 = typeof data[LOBOUND]; // number when const resolution is done, otherwise any
var tuple: [number, string] = [123, 'abc'];
type Elem4 = typeof tuple[0]; // number
type Elem5 = typeof tuple[1]; // string
type Elem6 = typeof tuple[999999]; // number|string
const ABC: 'a-b-c' = 'a-b-c';
let dict = { 'a-b-c': 123, 'd-e-f': true };
type Prop1 = typeof dict['a-b-c']; // number
type Prop2 = typeof dict['d-e-f']; // boolean
type Prop3 = typeof dict[ABC]; // number when const resolution work is done, otherwise any
// A simple function
declare function f1(n: number): string[];
type Ret1 = typeof f1(number); // string[]
type Ret2 = typeof f1(0); // error, 0 is not a type
// An asynchronous function that either accepts a callback or returns a Promise
declare function f2(n: number): Promise<string[]>;
declare function f2(n: number, cb: (err?: any, result?: string[]) => void): void;
type Ret3 = typeof f2(number); // Promise<string[]>
type Ret4 = typeof f2(number, any); // void
type Ret5 = typeof f2(number, Function); // ERROR: Function not assignable to callback
type Ret6 = typeof f2(number, (err: any, result: string[]) => void); // void
type Ret7 = typeof f2(number, (...args) => any); // void
// A special function-like object
interface Receiver {
(data: string[]): void;
transmogrify(): number[];
}
declare function f3(n: number, receiver: Receiver): Promise<void>;
declare function f3(n: number, callback: (err?: any, result?: string[]) => void): void;
type Ret8 = typeof f3(number, Receiver); // Promise<void>
type Ret9 = typeof f3(number, any); // picks first overload
type Ret10 = typeof f3(number, Function); // ERROR
type Ret11 = typeof f3(number, (...args) => any); // void since not assignable to Receiver
// A function with parameter destructuring
interface CartesianCoordinate {/***/}
interface PolarCoordinate {/***/}
declare function f4({ x: number, y: number }): CartesianCoordinate;
declare function f4({ r: number, t: number }): PolarCoordinate;
type Ret12 = typeof f4(any); // picks first overload
type Ret13 = typeof f4({x;y}); // CartesianCoordinate
type Ret14 = typeof f4({r;t}); // PolarCoordinate
type Ret15 = typeof f4({x;r;t;y}); // picks first overload
// Type-ception: is there anything wrong with typeof-in-typeof?
declare function f5(n: number, receiver: Receiver): Promise<void>;
declare function f5(n: number, callback: (err?: any, result?: string[]) => void): void;
function myCallback(err, result) {/***/}
var myReceiver: Receiver;
type Ret16 = typeof f5(number, typeof myReceiver); // Promise<void>
type Ret17 = typeof f5(number, typeof myCallback); // void
рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдБ рдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
const number = "number";
type Ret3 = typeof f2(number); // What happens here?
@SaschaNaz рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИред рдРрд╕реА рд╣реА рд╕реНрдерд┐рддрд┐:
class MyClass { foo; bar; }
declare function f(inst: MyClass): number;
type Ret = typeof f(MyClass); // number (presumably)
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ typeof f(MyClass)
рдореЗрдВ MyClass
_type_ рдХреЗ рд▓рд┐рдП MyClass
_value_ (рдпрд╛рдиреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди) рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдкреВрд░реНрд╡ Ret = number
рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓рд╛ error: MyClass is not a type
рдЬреИрд╕рд╛ рдХреБрдЫ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред
рдХреНрдпрд╛ рд╡рд╣реА рддрд░реНрдХ рдЙрд╕ рдирд╛рдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ рдЬреЛ _type_ рдФрд░ _const value_ рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ? рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рдХрд╛рд░ number
рд╣рдореЗрд╢рд╛ рдХреЙрдиреНрд╕реНрдЯ рд╡реИрд▓реНрдпреВ number
рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓реЗрдЧрд╛ред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ @RyanCavanaugh?
рдареАрдХ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рддрд╣рдд рд╣рд▓ рдХрд░реЗрдВрдЧреЗ (рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдиреЗ var x: [whatever]
рд▓рд┐рдЦрд╛ рдерд╛)ред рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрджрд╛рд╣рд░рдг рдкрдХреНрд╖ рдХреЗ рд╕рд╛рде f
рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП $ typeof f(MyClass)
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ typeof f(typeof MyClass)
рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде f
рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рддреЛ рдлрд┐рд░ @SaschaNaz рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ number
рдХреЛ _type_ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, _const value_ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рд╣реИ рдирд╛?
const number = "number";
type Ret3 = typeof f2(number); // Promise<string[]>
@RyanCavanaugh рдХреНрдпрд╛ рдЖрдк рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рддреАрд╕рд░рд╛ рд╕рдореВрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ? рдЬреИрд╕реЗ рдУрдкреА рд╕реЗ:
// Declare an interface DRY-ly and without introducing extra type names
interface MyInterface {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
},
// prop2 shares some structure with prop1
prop2: typeof (<MyInterface>null).prop1.big.complex; // OK: prop2 type is {anonymous: {type: {}}}
}
рдпрд╣ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ (рдЬреЛ рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде) рдЗрд╕ рд╕рдордп рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рд╣реИ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ this
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
prop2: typeof this.prop1.big.complex;
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ const
рдЪреАрдЬрд╝ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп typeof
рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
type Ret3 = typeof f2(typeof number); // typeof number is string so error here
... рдЬрдмрдХрд┐ рдпрд╣ typeof data[LOBOUND]
рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрдЧрд╛ред
@mhegazy рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ typeof this
ред рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдлреЛрд░реНрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЦреИрд░, рдпрд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди this
рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рдореЗрд╢рд╛ any
рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлреЛрд░реНрдХрдб рдЗрдореНрдкреНрд▓рд╛рдВрдЯ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЖрдЙрдЯрдкреБрдЯ:
class MyClass {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
};
prop2: typeof this.prop1.big.complex; // prop2 type is {anonymous: {type: {}}}
}
interface MyInterface {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
};
prop2: typeof this.prop1.big.complex; // prop2 type is any
}
рдХреНрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ this
рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрдХреНрд╖рд╛рдУрдВ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд░рд╣реЗрдЧреА?
рдореИрдВ #6179 рдФрд░ рдХреЛрдгреАрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЛ рдмрд┐рдВрджреБ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
class MyAPI {
constructor(token: string) {...}
foo() {...}
bar() {...}
static id = id;
}
return MyAPI;
}
type MyAPIConstructor = typeof myAPIFactory(null, 0); // OK: MyAPI is myAPIFactory's return type
function augmentAPI(api: MyAPIConstructor) {...} // OK
рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ 15 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рд╕рд╛рде рд╣реА рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдзрд┐рднрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП typeof
рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣рдо рд╢рд╛рдпрдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ?
type MyAPI = typeof myAPIFactory(...);
рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
angular.module('app').factory('MyAPI', function($http: HttpSvc, id: number) { /*...*/ });
рдЖрдорддреМрд░ рдкрд░ рдРрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ typeof
рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@ thron0 рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдРрд╕реА рдЪреАрдЬ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рд▓реЗрдХрд┐рди _also_ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реЛрдЧрд╛ред рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?
рдпрд╣ рджреБрд░реНрд▓рдн рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдХреЛрдгреАрдп 1 рджреБрд░реНрд▓рдн рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдкрд╣рд▓реЗ рдирд╣реАрдВред
рдореВрд▓ рд░реВрдк рд╕реЗ, рдЖрдкрдиреЗ рдЬреЛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдгреАрдп _factory_ рд╣реИ:
рдПрдХ рдРрд╕реА рдЪреАрдЬ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рднреА рджреЗрддрд╛ рд╣реИ
рдпрд╣ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ _service_ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрди рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЛ рдХрднреА рднреА рд╕реАрдзреЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред DI рдХрдВрдЯреЗрдирд░ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдЪреАрдЬ рдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп (рд╕реЗрд╡рд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рд╛рдПрдВ рд╣рдореЗрд╢рд╛ рдХреЛрдгреАрдп рдореЗрдВ рд╕рд┐рдВрдЧрд▓реЗрдЯ рд╣реЛрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╕реЗрд╡рд╛ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдореЗрдВ рдПрдХ рдЧреИрд░-рд╕рд┐рдВрдЧрд▓рдЯрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдлрд╝реИрдХреНрдЯрд░реА рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдпрд╛ рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди) рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рдЗрд╕ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:
angular.module('app').factory('MyAPI', function($http: HttpSvc, id: number) {
class MyAPI {
constructor(token: string) {...}
foo() {...}
bar() {...}
static id = id;
}
return MyAPI;
});
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class MyAPI {
// dependencies (1)
protected $http: HttpSvc;
protected id: number;
constructor(token: string) {...}
foo() {...}
bar() {...}
// Static properties cannot be used with this approach because:
// 1) this class is a global variable so it can be shared by different
// instances of the DI container,
// 2) the id property isn't available here as it's initialized in the subclass
//// static id0 = id;
}
angular.module('app').factory('MyAPI', function($http: HttpSvc, id: number) { // (2)
return class extends MyAPI {
$http = $http; // (3)
id = id;
};
});
// this type is needed for type annotations in the services that require MyAPI as a dependency
type MyAPIConstructor = typeof MyAPI;
angular.module('app').factory('someOtherService', function(MyAPI: MyAPIConstructor) {
var api = new MyAPI('qwerty');
/* ... */
});
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд╕реВрд░рдд рдФрд░ рджрд░реНрджрдирд╛рдХ рд╣реИред рдореБрдЭреЗ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рддреАрди рдмрд╛рд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдХрднреА-рдХрднреА рдХрдХреНрд╖рд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ (рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░) рд▓рд┐рдЦрдирд╛ рдФрд░ рдЕрдкрдиреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
рдирдорд╕реНрддреЗ, рдореИрдВ рдЯрд╛рдЗрдкрдСрдлрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕/рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХреНрд╕реЗрд╕ рдмреАрдЬрдЧрдгрд┐рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
рдЖрдЗрдП рдЯрд╛рдЗрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
type ::= ... | literalType | type typeAccess | guarded
guarded ::= "type" id
literalType ::= stringLiteral | numberLiteral | symLiteral | booleanLiteral
typeAccess ::= typeField | typeSubscript | typeCall
typeField ::= "." id
typeSubscript ::= "[" type "]"
typeCall ::= "(" [type {"," type}] ")"
рджрд╛рдпрд░реЗ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдПрдХ рд╕рд╛рде рджреЛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХреЗрд╡рд▓ рдкреВрд░реНрд╡ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░
class A {}
var a: A;
рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
class A {}
var a: type A;
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛
class ABC {
a: number;
b(x: number): string;
c:string[];
d:[number, string];
}
рддрдм рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗ
var a: (type ABC).a; // number
var b: (type ABC).b(number); // string
var c: (type ABC).c[number]; // string
var d: (type ABC).c[0]; // number
рдЗрд╕рдореЗрдВ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╕реНрдХреЛрдк рдореЗрдВ рд╕рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рддрд╣рдд _type_ рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ _value_ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
interface SAME {
x: number;
}
namespace SAME: {
export type x = boolean;
export var x: string;
}
var a: SAME.x // boolean
var b: (type SAME).x // number
var b: (typeof SAME).x // string
@RyanCavanaugh , @sandersn рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ?
рдЧреБрд░реБ, 19 рдордИ 2016 12:26 рдХреЛ рдЕрдирд╛рддреЛрд▓реА рд░реЗрд╕рд┐рди, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:
рдирдорд╕реНрддреЗ, рдореИрдВ рдЯрд╛рдЗрдкрдСрдлрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕/рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХреНрд╕реЗрд╕ рдмреАрдЬрдЧрдгрд┐рдд рд▓рд╛рдЧреВ рдХрд░реЗрдВ:рдЖрдЗрдП рдЯрд╛рдЗрдк рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
рдЯрд╛рдЗрдк рдХрд░реЗрдВ ::= ... | рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ | рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк рдПрдХреНрд╕реЗрд╕ | рд╕рдВрд░рдХреНрд╖рд┐рдд
рд╕рдВрд░рдХреНрд╖рд┐рдд ::= "рдЯрд╛рдЗрдк" рдЖрдИрдбреА
рд▓рд┐рдЯрд░рд▓ рдЯрд╛рдЗрдк ::= рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЯрд░рд▓ | рд╕рдВрдЦреНрдпрд╛ рд╢рд╛рдмреНрджрд┐рдХ | рд╕рд┐рдорд▓рд┐рдЯрд░рд▓ | рдмреВрд▓рд┐рдпрдирд╢рд╛рдмреНрджрд┐рдХ
рдЯрд╛рдЗрдк рдПрдХреНрд╕реЗрд╕ ::= рдЯрд╛рдЗрдкрдлрд┐рд▓реНрдб | рдЯрд╛рдЗрдкрд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрдЯ | рдЯрд╛рдЗрдк рдХреЙрд▓
рдЯрд╛рдЗрдкрдлрд┐рд▓реНрдб ::= "ред" рдкрд╣рдЪрд╛рди
рдЯрд╛рдЗрдкрд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрдЯ ::= "[" рдЯрд╛рдЗрдк рдХрд░реЗрдВ "]"
рдЯрд╛рдЗрдкрдХреЙрд▓ ::= "(" [рдЯрд╛рдЗрдк {",," рдЯрд╛рдЗрдк}] ")"рджрд╛рдпрд░реЗ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдПрдХ рд╕рд╛рде рджреЛ рд╕реЗ рдмрдВрдзрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕рдВрд╕реНрдерд╛рдПрдВ:
- рд╕рдВрдХрд▓рди рд╕рдордп рдкреНрд░рдХрд╛рд░
- рд░рди рдЯрд╛рдЗрдо рд╡реИрд▓реНрдпреВ
_type_ рдЧрд╛рд░реНрдб рдХреЗрд╡рд▓ рдкреВрд░реНрд╡ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░
рдПрдХ рдХрдХреНрд╖рд╛ {}
рдП: рдПрдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
рдПрдХ рдХрдХреНрд╖рд╛ {}
рдП: рдЯрд╛рдЗрдк рдПрдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛
рдХрдХреНрд╖рд╛ рдПрдмреАрд╕реА {
рдПрдХ рд╕рдВрдЦреНрдпрд╛;
рдмреА (рдПрдХреНрд╕: рд╕рдВрдЦреНрдпрд╛): рд╕реНрдЯреНрд░рд┐рдВрдЧ;
рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ[];
рдбреА: [рд╕рдВрдЦреНрдпрд╛, рд╕реНрдЯреНрд░рд┐рдВрдЧ];
}рддрдм рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗ
рд╡рд░ рдП: (рдПрдмреАрд╕реА рдЯрд╛рдЗрдк рдХрд░реЗрдВ)ред рдП; // рдирдВрдмрд░рд╡рд╛рд░ рдмреА: (рдПрдмреАрд╕реА рдЯрд╛рдЗрдк рдХрд░реЗрдВ)ред рдмреА (рд╕рдВрдЦреНрдпрд╛); // рд╕реНрдЯреНрд░рд┐рдВрдЧрд╡рд░ рд╕реА: (рдПрдмреАрд╕реА рдЯрд╛рдЗрдк рдХрд░реЗрдВ)ред рд╕реА [рд╕рдВрдЦреНрдпрд╛]; // рд╕реНрдЯреНрд░рд┐рдВрдЧрд╡рд░ рдбреА: (рдПрдмреАрд╕реА рдЯрд╛рдЗрдк рдХрд░реЗрдВ)ред рд╕реА [0]; // рд╕рдВрдЦреНрдпрд╛
рдЗрд╕рдореЗрдВ _type_ рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ _value_ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рд╡рд┐рд▓рдп рдХрд░рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ
рд╢рд╛рдмреНрджрд┐рдХ рджрд╛рдпрд░реЗ рдореЗрдВ рдПрдХ рд╣реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛редрдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рдорд╛рди {
рдПрдХреНрд╕: рд╕рдВрдЦреНрдпрд╛;
}рдирд╛рдорд╕реНрдерд╛рди рд╕рдорд╛рди: {
рдирд┐рд░реНрдпрд╛рдд рдкреНрд░рдХрд╛рд░ x = рдмреВрд▓рд┐рдпрди;
рдирд┐рд░реНрдпрд╛рдд рд╕рдВрд╕реНрдХрд░рдг рдПрдХреНрд╕: рд╕реНрдЯреНрд░рд┐рдВрдЧ;
}
var a: SAME.x // booleanvar b: (рдЯрд╛рдЗрдк SAME).x // numbervar b: (рдЯрд╛рдЗрдкрдСрдл SAME).x // string@RyanCavanaugh https://github.com/RyanCavanaugh , @sandersn
https://github.com/sandersn рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Microsoft/TypeScript/issues/6606#issuecomment -220378019
рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЯрд╛рдЗрдкрдСрдлрд╝ рдбреЙрдЯреЗрдб рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдФрд░ рдЯрд╛рдЗрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдЯрд╛рдЗрдк #1295 рдХрд╛рдлреА рд╕рдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рджреВрд╕рд░рд╛ рдЕрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рд╣реИред
рдореБрдЭреЗ рдЯрд╛рдЗрдкрдСрдлрд╝ рдХреАрд╡рд░реНрдб рдХреЛ рд╕реНрдХрд┐рдк рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рднреА рдкрд╕рдВрдж рд╣реИред
prop2: this.prop1.big.complex;
@mhegazy рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк typeof
this-expression
рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
prop2: typeof this.prop1.big.complex;
рдЪреВрдВрдХрд┐ рд╣рдо рдЖрдЬ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
someProp: this;
рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рдЕрдзрд┐рдХ рдмрд┐рдВрджреАрджрд╛рд░ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдПрдХ рдПрдХреНрд╕рдЯреНрд░рдкрд▓реЗрд╢рди рд╣реИ:
someProp: this.prop1.prop2.prop3;
рдФрд░ рдирд╣реАрдВ:
someProp: typeof this.prop1.prop2.prop3;
рдФрд░ рд╕рд┐рд░реНрдл рдПрдХреНрд╕рдЯреНрд░рдкрд▓реЗрд╢рди рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП - рдЯрд╛рдЗрдкрдСрдлрд╝ рдХреЛ рдПрдХ рд╕рд╛рде рдХреНрдпреЛрдВ рди рдЫреЛрдбрд╝реЗрдВ?
someProps: foo(number)
рдЯрд╛рдЗрдкрдСрдлрд╝ рдХреЛ рдПрдХ рд╕рд╛рде рдХреНрдпреЛрдВ рди рдЫреЛрдбрд╝реЗрдВ?
рдПрдХ рдХрд╛рд░рдг рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЧ рдпрд╛ рд╕реНрдерд┐рд░ рдкрдХреНрд╖ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрдХреНрд╖ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗ рд░рд╣реЗ рд╣реИрдВ:
class C {}
// Does 'x' have the instance type of 'C',
// or does it have the shape of its constructor?
let x: C;
рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг # 10588 рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЬреЛ рдЕрдм рдЗрд╕ рдЯрд┐рдХрдЯ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрдВрдж рд╣реИред
рдРрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:
interface Foo {
bar: string;
}
interface Box<T> {
container: T;
}
interface FooWithBoxedProps {
bar: Box<Foo.bar>; // OR: bar: Box<typeof Foo.bar>;
}
рдЬреЛ рдмрд╕ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛:
interface Foo {
bar: string;
}
interface Box<T> {
container: T;
}
interface FooWithBoxedProps {
bar: Box<string>;
}
рдЦреИрд░ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдЕрдм _indexed рдПрдХреНрд╕реЗрд╕ рдЯрд╛рдЗрдк_ (#11929) рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдорд╛рдирдХ typeof
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
interface MyInterface {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
},
// prop2 shares some structure with prop1
prop2: MyInterface["prop1"]["big"]["complex"];
}
рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЯрд╛рдЗрдкрдкреНрд░рддрд┐@рдЕрдЧрд▓реЗ рдореЗрдВ)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЪреАрдЬ рдХреБрдЫ рд╕рдорд╛рди рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ "рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреНрд░рдХрд╛рд░" рдЗрд╕ тАЛтАЛрддрд░рд╣ рд╣реЛрдВрдЧреЗ:
interface FunctionLike{
(arg1 : number, arg2 : string) : {a : number; b : string;}
}
type ReturnType = FunctionLike(number, string); // {a : number; b : string;}
рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ typeof
рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
interface BigThing {
testString: string;
testNumber: number;
testBoolean: boolean;
}
function getSmallThing(thing:BigThing){
return {
testString : thing.testString,
testBoolean : thing.testBoolean
}
}
type SmallThing = typeof getSmallThing(BigThing) // {testString: string; testBoolean : boolean}
рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдзрд╛рдЧреЗ (@tinganho) рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА рдЧрдИ рдереАред :)
рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╡рд░реНрддрдорд╛рди typeof
рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░рдЪрдирд╛ рдХрд░реЗрдВ, рдЬреИрд╕реЗ _indexed рдПрдХреНрд╕реЗрд╕ рдкреНрд░рдХрд╛рд░_ рдЕрднреА рдХрд░реЗрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреБрдЫ рдкреНрд░рд╢реНрди / рд╕рдВрджреЗрд╣ рдЕрднреА рднреА рдмрдиреЗ рд╣реБрдП рд╣реИрдВ:
typeofreturn
рдпрд╛ returnof
)рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕реЗ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди/рдкреНрд░рдХрд╛рд░ рддрд░реНрдХ рдЕрдиреБрдорд╛рди рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рддрд░реНрдХреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЬреЗрдирд░рд┐рдХ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдХреЙрд▓ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рдЕрдирд╛рдо рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рджреЗрдирд╛ рдЕрдзрд┐рдХ рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ? рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╢реИрд▓реАрдЧрдд рд╡рд░реАрдпрддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ рддрддреНрд╡ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╣реИред
рдЯрд╛рдЗрдк рдкреА = рдЯрд╛рдЗрдкреЛрдл рдлреВ (0); // рдкреА рдХреЛрдИ рд╣реИ []
рдЯрд╛рдЗрдк рдХреНрдпреВ = рдЯрд╛рдЗрдкреЛрдлрд╝ рдлреВ (рд╕рдЪ); // рдХреНрдпреВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдкрд░ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПред
рд╕рдВрджрд░реНрдн: рдореИрдВ рд╡рд╕реНрддреБрдУрдВ рдкрд░ map
рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
function map<T, F extends Function>(fn: F, obj: T): { [P in keyof T]: typeof F(T[P]) }
рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ F
(рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдирд╛рдо fn
рд╕реЗ рдЕрд▓рдЧ) рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдирд╛рдо рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП I' d type MapFn<T, F extends Function> = { [P in keyof T]: typeof F(T[P]) }
рдХрд╣рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рд╢рд╛рдпрдж рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ (рдФрд░ рдЕрднреА рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА) рд╣реЛрдЧрд╛:
const myFunc = () => ({ x: 10 });
type myType = returnof myFunc; // { x: number; }
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреБрдЫ рд╕реНрддрд░реЛрдВ рддрдХ рдЧрд╣рд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рднреА рдЬрдВрдЬреАрд░ рдореЗрдВ рдмрд╛рдВрдзрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдКрдкрд░ @mpawelski . рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
@dehli рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
@JsonFreeman рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ OR
рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛? рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ?
рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдХреБрдЫ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджрд░реНрдж рд╣реИред
рдЪреВрдВрдХрд┐ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
// 0 argument function
export default function returnof<T>(fn: () => T): T;
// 1 argument function
// If no ambiguity simply infer the return type
export default function returnof<A, T>(fn: (a: A) => T): T;
// 1 argument function, with possible overload for the argument type.
// Explicitly set the type and use the correct overload
export default function returnof<A, T>(fn: (a: A) => T, a: A): T;
// ...
рдпрджрд┐ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рддрд░реНрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
const hello = (arg: number) => 'World'
const helloReturnValue = returnof(hello)
type helloReturnType = typeof helloReturnValue // string
declare function hello(): void;
declare function hello(a: number): number;
const helloReturnValue = returnof(hello)
type helloReturnType = typeof helloReturnValue // void
const helloReturnValue = returnof(hello, 42)
type helloReturnType = typeof helloReturnValue // number
рд╕рднреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдпрд╣рд╛рдБ рд╣реИрдВ:
https://github.com/kube/returnof/blob/master/lib/returnof.d.ts
рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ NPM рдкреИрдХреЗрдЬ рдмрдирд╛рдпрд╛ рд╣реИред
рдпрджрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдХреЛ https://github.com/Microsoft/TypeScript/issues/2175 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА рддрд░рд╣ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШреЛрд╖рдгрд╛рддреНрдордХ-рдХреЗрд╡рд▓ рд╕рдорд╛рдзрд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
type Return<T extends () => S, S> = S
рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:
type helloReturnType = Return<typeof hello>
@mhegazy @JsonFreeman рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдХреЛрдИ рдпреЛрдЬрдирд╛?
рд╣реЗрд▓реЛ рд╕рдм рд▓реЛрдЧ,
рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ) - рдореИрдВрдиреЗ рдЗрд╕реЗ # 13949 рдЕрдВрдХ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЙрд╕ рд╕реНрддрд░ рдкрд░ рдЯрд╛рдЗрдкреЛрдлрд╝ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, =MyType
рдЬреИрд╕рд╛ рдХреБрдЫ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдХрд╣реАрдВ рднреА MyType
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ MyType
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдПрдХ рдмрдирд╛рддрд╛ рд╣реИ рд╡рд╕реНрддреБ рдХреЗ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ рд╕реЗ MyType
рдирд╛рдо рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Vue рдШрдЯрдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдХрд░реВрдВрдЧрд╛ред
function createData(){
return <=MyData>{
dataProp1: <string>null
}
}
function method1(){
let self: MyComponent = this;
console.log(self.dataProp1);
self.method2();
}
function method2(){
let self: MyComponent = this;
//dostuff
}
type MyComponent = MyData & MyMethods;
let componentOptions = {
data: createData,
methods: <=MyMethods>{method1, method2}
}
//todo: register component...
рдиреЛрдЯ createData
рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд┐рдд рджреНрд╡рд╛рд░рд╛ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
function createData(): =MyData {
return {
dataProp1: <string>null
}
}
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдордЬреЗрджрд╛рд░ рдХрд╛рдо рдорд┐рд▓рд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ:
const varWithRightType = (false as true) && some.deep.access()
type MyType = typeof varWithRightType;
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭ рдкрд░ рд╣рдВрд╕рдирд╛ рдмрдВрдж рдХрд░реЛ рдпрд╣ рдЧрдВрднреАрд░ рдкреНрд░рдХрд╛рд░ рд╣реИ
@johnfn рдпрд╣ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдордЬреЗрджрд╛рд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ :), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рдкреИрд░рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
const stateProps = (false as true) && mapStateToProps({} as any);
рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдХрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░реЗрдбрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрдм mapStateToProps
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░реЛрдк рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ Redux connect
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рдХреЗ рд▓рд┐рдП рдердХрд╛рдК рд╣реИред
рдпрд╣ рдХрд╛рдо рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛ред
typeof
рдСрдкрд░реЗрдЯрд░ "React & Redux" рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рдиреАрдЪреЗ
typeof
рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реАрдпрд▓-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдкрд░ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
import { returntypeof } from 'react-redux-typescript';
import { RootState } from '../../store';
...
const mapStateToProps = (state: RootState) => ({
currencies: CurrencyRatesSelectors.getCurrencies(state),
currencyConverter: storeState.currencyConverter,
});
const stateProps = returntypeof(mapStateToProps);
type Props = typeof stateProps & typeof dispatchToProps;
type State = {};
class CurrencyConverterContainer extends React.Component<Props, State> {
...
рд╕реНрд░реЛрдд: https://github.com/piotrwitek/react-redux-typescript-patterns#react -connected-components
@kube рдХрд╛ рд╕рдорд╛рдзрд╛рди рдФрд░ рдЙрдирдХрд╛ рдкреИрдХреЗрдЬ https://github.com/kube/returnof рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ! рдореИрдВ
рд╣рдореНрдоред рдХрд╛рд╢ returnof
.d.ts
рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЯрдкрд▓-рдЖрдзрд╛рд░рд┐рдд map()
рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рдкрд░ рдЗрд╕рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП ( const
рдкрд░рд┐рд╡реЗрд╢реА рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ ), рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЬреЗрдирд░рд┐рдХ рдЕрдм рддрдХ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ @kube рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдХреА рднрд╛рд╖рд╛ рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдХрд░рдг ( type Return<T extends () => S, S> = S
-> type helloReturnType = Return<typeof hello>
) рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реЛ рдЬрд╛рдПрдЧреАред :рдбреА
рд╕реБрдзрд╛рд░: рдирд╣реАрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреЗрдиреЗрд░рд┐рдХ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕рдорд░реНрдерди рд╕реЗ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдЕрдкрдиреЗ рдЕрдиреБрдорд╛рдирд┐рдд рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ; Return<typeof hello>
рдмрд╕ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ Generic type 'Return' requires 2 type argument(s).
ред
@ tycho01 рд╣рд╛рдБ, рдореИрдВ рдирд┐рд░рд╛рд╢ рдерд╛ рдХрд┐ рдЗрд╕рдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ:
рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдбрдореА рдкрд░рд┐рд╡реЗрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрдорд╛рди рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдкрд░рд┐рд╡реЗрд╢ function returnTypeOf<RT>(fn:(...rest:any[])=>RT):RT {return void 0};
рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ var r = returnTypeOf(someFunction);
рдореВрд▓реНрдп undefined
. рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЙрд╕ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ... рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╛рдкрд╕ рд╡рд╣реАрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдХреА рдереА:
type RT = typeof r;
рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ typeof рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ typeof
returntypeof
рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрдиреБрдорд╛рди typeof fn(a,b,c,...)
рд╕реЗ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рддрдм рд╡рд┐рднрд┐рдиреНрди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ . рдпрд╣ рд╡рд╛рдкрд╕реА-рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдордЭ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА TS рджреНрд╡рд╛рд░рд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред
typeofexpression ()
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рд┐рдЯрд░реНрди-рдЯрд╛рдЗрдк рд░рд┐рдХрд░реНрд╕рди рд╣реЛрдЧрд╛ рдЬреЛ рдЯрд╛рдЗрдк рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрдЧрд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
type E = typeofexpression (f(1) + g("x"))
рд╣реИ
type E = typecomprehensionof (typeof f(1) + typeof g("x"))
рдЬрд┐рд╕реЗ рдПрдХ рдХреА рддрд░рд╣ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
type E = typecomprehensionof (string + string)
рдпрд╛рдиреА string
type E = typecomprehensionof (string + number)
рдпрд╛рдиреА string
type E = typecomprehensionof (number + number)
рдпрд╛рдиреА number
рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдЧрдд рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ------------------------------------------------- ------------
рдореЗрд░рд╛ рдорддрд▓рдм рдЬреЛрдбрд╝рдирд╛ рдерд╛ ... рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕реЗ Function.bind, Function.apply, Function.call рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ any
рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛- рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рди рд╣реЛрдВред
рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ ... рдЖрдирдВрдж ...
@poseidonCore
рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ ... рдЖрдирдВрдж ...
рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди typeof <expression>
рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореБрджреНрджрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА #12342 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдореЗрдВ рдЙрди рдЙрдкрдпреЛрдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ typeofexpression
рдФрд░ typecomprehensionof
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ typeof (expression)
рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред
рдореЗрд░рд╛ рдХрд╣рдирд╛ рдерд╛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ ... f(1)
рднреА рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред #12342 рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╡реЗ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВред
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд░ рдХреЗ рд▓рд┐рдП typeof
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЪреВрдВрдХрд┐ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЕрдЧрд▓реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд░рд╣реА рд╣реИ ... рдФрд░ рдлрд┐рд░ рдкреНрд░рдХрд╛рд░ рдирд┐рдпрдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдордЭреЗрдВ .
рджрд░рдЕрд╕рд▓, рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБред рдореБрджреНрджрд╛ # 12342 рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐ рдЬреИрд╕реА рдЪреАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдВрдмрдВрдз рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ред
рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ typeof
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд▓реЗрдХрд┐рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
function myFunction<T>(param1: T, param2: string, param3: number): T & {test: string} {
// ...
}
type ResultType = typeof myFunction({hello: string}, string, number)
// ResultType is: {hello: string} & {test: string}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рднреА рдХреЙрд▓ рдХреЗ рднреАрддрд░ рдЯрд╛рдЗрдкреЛрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдк рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд:
type ResultType = typeof myFunction(typeof obj, string, number)
// ResultType is: typeof obj & {test: string}
рдпрд╣ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╕ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛:
interface IAlertMessage {
addedAt: number;
text: string;
type: "error" | "warning" | "info" | "success";
}
declare let alertMessageInterface: IAlertMessage;
const messages: IAlertMessage[] = [];
function addMessage(text: string, type: typeof alertMessageInterface.type): void {
messages.push({addedAt: new Date().getTime(), text, type});
}
addMessage("something", "info"); // <- OK - and also has intellisense for the second parameter (after typing first " of the second parameter, press Ctrl+Space in VSCode)
addMessage("something", "fatal"); // <- Compilation error : error TS2345: Argument of type '"fatal"' is not assignable to parameter of type '"error" | "warning" | "info" | "success"'.
рдЙрдкрд░реЛрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
declare let myIface: MyInterface;
interface MyInterface {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
},
prop2: typeof myIface.prop1.big.complex.anonymous;
}
рдореЗрд░реЗ рд▓рд┐рдП type ...
$ рдХреЗ рдмрдЬрд╛рдп declare let ...
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ .js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рднреА рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
@varadero рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдк рдЬреЛ рдХреБрдЫ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.2 рдХреЗ рдмрд╛рдж рд╕реЗ рдПрдХ рд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ (рдирдХрд▓реА) рдореВрд▓реНрдп рдХреА рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрдкрдХреЛ "рд╢реБрджреНрдз" рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрдСрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!
рдЪреВрдВрдХрд┐ type KEYOF<T extends any[]> = keyof T[0]
рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, typeof T[0]('something')
рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ function myFunc<T, K extends KEYOF<T>>(type: K)>{ }
рдФрд░ myFunc([(r: string) => r])
( typeof T[0]('something')
рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдПрдЧрд╛) ?
рдпрд╣ рдмрд╣реБрд░реВрдкреА this
рдХреЗ рд╕рд╛рде рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрдЧрд╛ред
рдРрд╕рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп!
рдЗрд╕ рд╕реВрддреНрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдХрд░, рдореИрдВрдиреЗ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рд╣рдо typeof
рд╕рд┐рдВрдЯреИрдХреНрд╕-рд╡рд╛рд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреНрдпреЛрдВред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд▓рд╛рдЧреВ рдорд╛рдореВрд▓реА typeof foo
рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ foo
рдХрд╛ рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ pet is Fish
рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рд╣реИред)
рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЗрд╕ рдЦреЛрдЬрд╢рдмреНрдж рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдкрдврд╝рдиреЗ рдореЗрдВ, рдЦреЛрдЬрд╢рдмреНрдж рд╕реНрд╡рдпрдВ рдЕрдм рдЬреЛ рдХрд░рддрд╛ рд╣реИ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ typeof
рдХреАрд╡рд░реНрдб рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдореИрдВ рдЗрд╕реЗ рдКрдкрд░ рд▓рд╛рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЪрд╛рд╣реЗ рд╡рд╣ type
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛ), рдмрдЬрд╛рдп рдПрдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐, рдЬрдмрдХрд┐ typeof fn<A>(string)
рдХреЛ typeof
$ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рд╕реНрддрд░ рдЪрд░ fn
рдХреЛ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реА рдУрд░ Fn<A>(string)
, Fn
рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд▓реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ 'рд▓рд╛рдЧреВ' рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ typeof
рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдпрд╣рд╛рдВ рдЙрдЪрд┐рдд рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЗрд╕ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ, рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рднреА рдмрд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ: typeof fn(...)
/ typeof fn<...>(...)
рдХреЗ рдЕрд▓рд╛рд╡рд╛ Fn(...)
/ Fn<...>(...)
рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдХрд╛рд░реНрдп рднреА рдирд╣реАрдВ рд╣реИ рд╢рд╛рдмреНрджрд┐рдХ ((foo: Foo) => Bar)(Baz)
/ + рдЬреЗрдирд░рд┐рдХред рдЕрдиреНрдпрдерд╛, рд╣рдорд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдмрд░рдХрд░рд╛рд░ рд░рд╣рдиреА рдЪрд╛рд╣рд┐рдПред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ (рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЙрдирдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдорд┐рд▓рд╛)ред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ typeof
рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рдЕрдзрд┐рднрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдЕрд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рд▓реЗрд╡рд▓ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдЯрд╛рдЗрдк рд▓реЗрд╡рд▓ рддрдХ рдЙрдард╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ ( рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рд▓реЗрд╡рд▓ typeof
рд╕реЗ рдЕрд▓рдЧ), рдЪреАрдЬреЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓рдЧрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдФрд░ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди GetFn<A><B>()
рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓рд╛ рдЬреЗрдиреЗрд░рд┐рдХ рд╕реЗрдЯ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдордВрддреНрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛, рдмрд╛рдж рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЖрдордВрддреНрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ GetFn<A><B><C>()
рдирд╣реАрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ GetFn<A><B>()<C>()
рд╡реИрдз рднреА рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╣рд▓реЗ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИ: рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2: рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ X<Y>()
рдореЗрдВ рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реЛрдЧреАред рдЕрдм, X
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред
X
рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ - <Y>
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИредX
рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредX
рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЬреЗрдиреЗрд░рд┐рдХ рд╣реИ, рддреЛ рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредX
рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИредX
рдХреЛ рдЗрд╕рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ <Y>
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░реЗрдЧрд╛редрдореБрдЭреЗ рдЕрднреА рддрдХ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред
<>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдПрдХ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред@icholy : рд╣рд╛рдБ, рдпреЗ рд╕рдВрдкрд╛рджрди рдЖрдкрдХреЗ рдмрд┐рдВрджреБ рдХреЛ рдФрд░ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 3: рдареАрдХ рд╣реИ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдм рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд╣реИред рдЕрдиреБрдорд╛рди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдЕрдкрдЧреНрд░реЗрдб рджреВрд░ рд╕реЗ рднреА рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред
@icholy : рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрджрд┐ 'рдлрд╝рдВрдХреНрд╢рди' рд╕рд╛рдорд╛рдиреНрдп/рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдЕрднреА рднреА typeof
рд▓рд┐рдЦреЗрдВрдЧреЗ?
рдпрджрд┐ рдРрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдУрд╡рд░рд▓реЛрдб рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рдореБрдлреНрдд рдореЗрдВ "рд╡реИрд░рд┐рдПрдбрд┐рдХ" рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ (рд╡реЗ> 1 рдПрд░рд┐рдЯреА рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл рдХрд░реАрдмреА рд╣реИрдВ), рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдмреЗрд╕-рдХреЗрд╕ рдЕрдзрд┐рднрд╛рд░ рдХреЗ рд╕рд╛рде, рдЗрд╕рдХреЗ рдЕрдзрд┐рднрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЪреАрдЬреЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдПрдХ рдЕрджреНрднреБрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред
@masaeedu : рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рд╣рд╛рдБ, рдЕрдзрд┐рднрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЗрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддреЗ рд╣реИрдВ - рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ any
рдлрд╝реЙрд▓рдмреИрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдЕрднреА рддрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрднрд╡ рдирд╣реАрдВ рдереАред
рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдореИрдВрдиреЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд░рд╛рдорджрд╛ рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдХрд░реА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЧрдардмрдВрдзрди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд░реА рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдХреНрдпрд╛ рдЖрдк рд╢рд╛рдпрдж рдХреБрдЫ рдЫрджреНрдо рдХреЛрдб рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ Object.assign
рдЬреИрд╕реЗ рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ ( &
рдмрдирд╛рдо Overwrite
рдЬреИрд╕реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдореЗрд░реЗ рдкреАрдУрд╕реА рдореЗрдВ R.mergeAll
рдХреЗ рд▓рд┐рдП)?
@ tycho01 рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд░рд╣рд╛ рд╣реВрдВ:
interface Pop<TVarStack extends VarStack> {
(a: TVarStack["head"]): Pop<TVarStack["tail"]>
}
interface VarStack<THead = any, TTail extends (void | VarStack) = any> {
head: THead
tail: TTail
<TNew>(a: TNew): VarStack<TNew, this>
(): (a: Pop<this>) => any
}
// Figure out implementation later :)
let stack: VarStack<void, void>;
const pop = stack(new Date())(10)("Bob's")("your")("uncle")()
// a, b, c, d, and e are well-typed
pop(a => b => c => d => e => {
// Need this because can't figure out how to encode base-case in Pop recursion
return stack
})
VarStack
рдПрдХ рдЕрд░реНрде рдореЗрдВ рдПрдХ "рд╡реИрд░рд┐рдПрдбрд┐рдХ" рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЗрд╕реЗ рд╡рд┐рд╖рдо рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рд░рд┐рдХрд░реНрд╕рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ typeof
рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА, рддреЛ рдореИрдВ Pop
рдХреЗ рд▓рд┐рдП рдмреЗрд╕-рдХреЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛, рдХреНрдпреЛрдВрдХрд┐ returnof(overloadedFunction(T))
рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдкреИрдЯрд░реНрди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджреЗрдЧрд╛- рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдорд┐рд▓рд╛рдиред
@ tycho01 рдореИрдВ рдЗрд╕реЗ Object.assign
рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рдХреЗрд╡рд▓ рдХрд░реАрдмреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдХрд░реАрдмреА assign
рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЙрд╕реА рддрд░рд╣ред
рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмреАрдЬрдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рджреЗрдВ, рддрд╛рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (a: string) => (b: number) => void
рдХреЗрд╡рд▓ Func<string, Func<number, void>>
рдХреЗ рд▓рд┐рдП рдЪреАрдиреА рдереА, рдФрд░ (a: string, b: number) => void
рдХреЗрд╡рд▓ Arity<number, Arity<string, void>>
рдХреЗ рд▓рд┐рдП рдЪреАрдиреА рдереА, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫред рдлрд┐рд░ рд╣рдореЗрдВ рдЖрдХрд╕реНрдорд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд░реЛрдЪрдХ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдЙрдкрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЯреНрд░рд┐рдкрд▓ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдЦреЗрдж рд╣реИред @ tycho01 рдпрд╣рд╛рдБ рдХрд░реА рд╣реИ, "рд╡реИрд░рд┐рдПрдбрд┐рдХ" assign
:
interface Assign<TCurr extends {} = {}> {
<TAdd extends {}>(a: TAdd): Assign<TCurr & TAdd>
(): TCurr
}
let assign: Assign = undefined // implement somehow
const result = assign({ foo: "bar" })({ baz: 42 })()
@masaeedu : рд╣рд╛рдБ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд░реЗрдбреНрдпреВрд╕рд░ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдиреЗ рдЬреИрд╕рд╛ рд╣реИ :), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЧреИрд░-рд╡реИрд░рд┐рдПрдбрд┐рдХ (?) рддрд░реНрдХ рднреА рд╣реЛрдиреЗ рдкрд░ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛; рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВред
рдЕрдЧрд░ рд╣рдо рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдореИрдВ рдЯреАрд╕реА39 рдХреЛ Object.assign
рдХреЛ рдЧреИрд░-рд╡реИрд░рд┐рдПрдбрд┐рдХ mergeAll
рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реВрдВрдЧрд╛ред :рдбреА
рдореЗрд░реЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐-рдЖрдзрд╛рд░рд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рддрд░рд╣ рдирд╣реАрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рддрдХ (# 17086) рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ ...
@ tycho01 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд╡рд┐рд╡рд┐рдз рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдзрд░реНрдорд╛рд░реНрде рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдХрд░реНрд╖рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд░реАрдмреА рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдмрд╛рд░-рдмрд╛рд░ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЧрдд рд╣реИ рдЬреЛ рдЬреЗрдПрд╕ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореМрдЬреВрджрд╛ рдЬреЗрдПрд╕ рдЗрдВрдЬрди рдФрд░ рдХреЛрдб) рд╢рд╛рдпрдж рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдПрд░рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдбреАрдХрдВрд╕реНрдЯреНрд░рдХреНрдЯ рдХрд░рдирд╛> 1 рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм #5453 рдкрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред
рджреВрд╕рд░реЛрдВ рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реА ++ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: decltype(expression)
рдХреНрдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рд╣реИ?
рдореИрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлреЙрд░реНрдо рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рддрд░реНрдХ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреАрдПрд╕ рдЯреАрдо рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░рдЦрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрддрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд░рддрд╛ рд╣реИред
рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдКрдкрд░ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХреЗрдВред рдЕрд░реНрдерд╛рддреН, рдпрд╣ рдПрдХрд▓:
type A = typeof anotherVariable
ред рдореИрдВ рдмрд╕ рдЗрд╕реА рдПрдХ рд▓рд╛рдЗрди рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред interface B extends A
, <B & A>
: B & A
, рдЖрджрд┐ред
рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред рдЬрдм рдЖрдк рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдШрдЯрдХ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдПрдЪрдУрд╕реА рд╣реИред
рдореИрдВрдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ рджреЛ рд╡рд░реНрдЧ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдПрдХ рд╡рд░реНрдЧ React.Component
рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ HOC рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреА рдХрдХреНрд╖рд╛ render()
рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддреА рд╣реИред
@blindbox type A = typeof anotherVariable
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
function checkItem(item: typeof data) {
// item is Array<{ raw: number; square: number; }>
}
@Igorbek рд╡рд╛рд╣, рддреБрдо рд╕рд╣реА рд╣реЛред
рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдореЗрд░реА рдУрд░ рд╕реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛
interface B {
thisIsB: boolean
}
const typeTest = (type: any) => {
return 1 as any as App & B
}
type A = typeof typeTest(1)
declare const aVal: A; // aVal's type isn't of type App & B, but something else.
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
interface B {
thisIsB: boolean
}
const typeTest = (type: any) => {
return 1 as any as App & B
}
const typeTestVal = typeTest(1)
type A = typeof typeTestVal
declare const aVal: A; // aVal's type is of type App & B!
рд╣рд╛рдБ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЬрдм рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
function someFunctionWithComplexReturnTypeThatUsesGenerics<T>(item: T) { ... }
// it is impossible to work this around because there's no chance to create a fake variable that would be parameterized by T
function use<T>(item: typeof someFunctionWithComplexReturnTypeThatUsesGenerics<T>(item)) { ... }
@ рдЗрдЧреЛрд░рдмреЗрдХ :
рдореИрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлреЙрд░реНрдо рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рддрд░реНрдХ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреАрдПрд╕ рдЯреАрдо рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░рдЦрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрддрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдЬрдм рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ, рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╖рд░ рдорд┐рд▓ рдЧрдП рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдЕрд╕реНрдкрд╖реНрдЯ рд╣реЛ рд░рд╣реА рд╣реИрдВ - рд╡реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╢рд╛рдмреНрджрд┐рдХ рд╕рд░рдгреА рдФрд░ рд╡рд╕реНрддреБрдПрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддреА рд╣реИрдВ, рдЕрдм рддрдХ рдЗрддрдиреА рдЕрдЪреНрдЫреАред
рддреЛ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп/рдкреНрд░рдХрд╛рд░ рднреА рд╣реИрдВ, рдЬреИрд╕реЗ рдЪрд░, рдЬреЗрдирд░рд┐рдХ, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ред рдЪреАрдЬреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЗрдирдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдВ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд┐рд╢реНрд░рдг рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдореБрдлреНрдд рдореЗрдВ рдЖрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдХрд╣рдиреЗ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐, рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА typeof myVar
рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди 'рдПрдкреНрд▓рд┐рдХреЗрд╢рди' рдЯрд╛рдЗрдк рд╕реНрддрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдирд┐рдпрдорд┐рдд рдЪрд░ рджреЛрдиреЛрдВ рдореЗрдВ рдкреНрд▓рдЧ рдЗрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ .
рдореБрдЭреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЖрдкрдХреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рджреЗрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред рдмреЗрд╢рдХ, рдпрд╣ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдЬреЗрдПрд╕-рдЖрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ (рд╕реЛрдЪреЗрдВ !
&&
||
+
-
*
/
instanceof
) рдФрд░ рд╕рд╛рде рд╣реА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ (рдЕрднрд┐рдХрдерди рдСрдкрд░реЗрдЯрд░ !
)ред
рдЙрди рдЬреЗрдПрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдЗрд╕ рддрд░рд╣ рд╣реИ ... рд╡реЗ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░ рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдмреНрджрд┐рдХ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ ( рд░реЗрдлрд░реА ) - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ -рд╕реНрддрд░ 1 + 1
рдХреЗрд╡рд▓ number
рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИред
рдЗрд╕ рдмрд╛рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдореИрдВ рд╕реНрд╡рдпрдВ рдЙрдирдХреЗ рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдереЛрдбрд╛ рдиреАрдЪреЗ рдЖ рдЧрдпрд╛ рд╣реВрдБред
рдХреНрдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрднреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рд╣реИ? [...] рд╣рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд▓рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реАрдорд┐рдд рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдПред
@ tycho01 typeof
рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЖрдзрд╛рд░рд┐рдд рднрд┐рдиреНрдирддрд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рддрд░реНрдХ рд▓рдЧрднрдЧ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ @yortus рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╣реИрдВ:
typeof
(рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдкреНрд░рддреАрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд╢ рд╣реИред рддрд╛рдХрд┐ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЫрджреНрдо рдХреЙрд▓ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдХрд┐ рдПрдХ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╢рд╛рдЦрд╛ рд╣реИ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд)ред(undefined as any as <any arbitrary type can be here>)
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкреНрд░рд╕рд╛рд░ рдФрд░ рдмрд╛рдХреА рдкреНрд░рдХрд╛рд░ рдмрд╛рдж рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рд╡ рдЙрддрд░рд╛ рдЧрдпрд╛ рдерд╛)редрдзрдиреНрдпрд╡рд╛рдж @ tycho01 рдХрд┐ рдЖрдкрдиреЗ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ promised
PR (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдЖрдпрд╛ рдерд╛) рдкрд░ рд▓рд╛рдпрд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдкрдХрд╛рдП рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рдХрд╡рд░ рдХрд░ рд╕рдХрддреА рд╣реИред рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВред
рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд typeof
рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреЗрдо рдЪреЗрдВрдЬрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣/ keyof
рдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред
@ рдЗрдЧреЛрд░рдмреЗрдХ : рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХрд╣рд╛рдВ рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВред рд╢рд╛рдпрдж рдпреЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрдЬ рдХреЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЖрдЬ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯреАрдПрд╕ (рдпрд╛, рдареАрдХ рд╣реИ, рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдХрд╛ 2.3.3
) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдореВрд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
// I have a strongly-typed collection but the element type is anonymous/unknown, how can I reference the element type? (#3749)
// Mapping to a complex anonymous type. How to reference the element type?
var data = [1, 2, 3].map(v => ({ raw: v, square: v * v }));
declare function checkItem(item: typeof data[0]): any
// ^ no longer errors, needs no further change
// A statically-typed dictionary. How to reference a property type?
var things = { 'thing-1': 'baz', 'thing-2': 42 };
type Thing2Type = typeof things['thing-2'];
// ^ no longer errors, needs no further change
// A strongly-typed collection with special indexer syntax. How to reference the element type?
var nodes = document.getElementsByTagName('li');
type ItemType = typeof nodes.item(0);
// ^ the `.item` access works, but function applications still errors, would be fixed by either version of the proposal.
// A function returns a local/anonymous/inaccessible type, how can I reference this return type? (#4233, #6179, #6239)
// A factory function that returns an instance of a local class
function myAPIFactory($http: HttpSvc, id: number) {
class MyAPI {
constructor(http) {}
foo() {}
bar() {}
static id = id;
}
return new MyAPI($http);
}
declare function augmentAPI(api: typeof myAPIFactory(HttpSvc, number) /* ERROR */): any
// ^ function applications errors, would be fixed by either version of the proposal, if using slightly different syntax.
// I have an interface with a complex anonymous shape, how can I refer to the types of its properties and sub- properties ? (#4555, #4640)
// Declare an interface DRY-ly and without introducing extra type names
type MyInterface = {
prop1: {
big: {
complex: {
anonymous: { type: {} }
}
}
},
// prop2 shares some structure with prop1
prop2: MyInterface['prop1']['big']['complex'];
}
// ^ no longer errors after swapping `.k` access to `['k']`. `typeof` was unnecessary and counter-productive -- MyInterface isn't exposed on the expression level.
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реИрдВ, рдФрд░ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдпрд╛ рддреЛ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред
рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ рдЖрдзрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдВрдЧрдирд╣реЛ рджреНрд╡рд╛рд░рд╛ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдЯреАрдПрд╕ рдЯреАрдо рдФрд░ рдореИрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЪрд░ рдХреЛ typeof
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдЙрдЬрд╛рдЧрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкреАрдЫреЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ рд╕реНрддрд░ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕реНрдкреНрд░реЗрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдФрд░ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдореМрдЬреВрджрд╛ рдЕрдВрддрд░ рдХреЗ рдмрд╣реБрдд рд╕реЗ рдпрд╣рд╛рдВ рднреА рдирд┐рдкрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕реА рддрд░рд╣, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдкреНрд░рдердо рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА <MyType> whatever
рдпрд╛ whatever as MyType
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ typeof
рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдмрд╛рдж рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рд╣реЛрдЧрд╛: рдкреНрд░рд╢реНрди рдкреНрд░рдХрд╛рд░/рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдкреНрд░рдХрд╛рд░-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдмрдирд╛рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) - рдЙрдЪреНрдЪ-рдЖрджреЗрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдЕрдиреБрдорд╛рди, рд╕рд╛рде рд╣реА рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рд╕рд╢рд░реНрдд рдХрд╣рддреЗ рд╣реИрдВ рдЙрд╕ promised
рдзрд╛рдЧреЗ рдХреА рддрд░рд╣ред * рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдУрдкреА рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрдирдХрд╛ рдХреЛрдИ рдХрд╛рдордХрд╛рдЬ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХрд╣рд╛рдВ рдЯрдХрд░рд╛рддреЗ рд╣реИрдВ - рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ typeof
рдХреАрд╡рд░реНрдб рдЕрдкрдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдореВрд▓реНрдп рд╕реНрддрд░ рдкрд░ рдмрджрд▓ рджреЗрдЧрд╛, рдмрдирд╛рдо (рдореЗрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдореЗрдВ) typeof
рдХреЛ рдЫреЛрдбрд╝рдХрд░ , рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ред
рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХреБрдЫ рд╣рдж рддрдХ рдЖрдХрд╕реНрдорд┐рдХ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреА рд╡реИрдзрддрд╛ рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛; рдЕрдЧрд░ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ рддреЛ рдореИрдВ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреАрд╡рд░реНрдб рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрджрд╛рд╕реАрди рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреАрд╡рд░реНрдб рдПрдХ рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп - рдореИрдВ рд╕рд┐рд░реНрдл рдмрдХрд╡рд╛рд╕ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
*: рдореБрдЭреЗ рдЕрднреА-рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рд╣реИ рдХрд┐ рдЖрдк рдЬреЗрдирд░рд┐рдХ рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдирдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдХреЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВрдЧреЗред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: typeof
рдореВрд▓реНрдп рд╕реНрддрд░ рд╕реЗ рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рддрдХ рдЙрдард╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ declare let y: x;
рдЪреАрдЬреЛрдВ рдХреЛ рдореВрд▓реНрдп рд╕реНрддрд░ рд╕реЗ рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рддрдХ рдЙрдард╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдУрдкреА рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреА рддрд░рд╣ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг, рд▓реЗрдХрд┐рди рд╣рд╛рдБред
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЬреЗрдирд░рд┐рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рд╡реЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣реЛрдВрдЧреЗред
рдЕрдЧрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреВрд░реНрд╡-рдЦрд╛рд▓реА рд░реВрдк рд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рд╢рд╛рдпрдж рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдирд╕реБрд▓рдЭреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдкрд░ рдореЗрд░реА рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдЧрддрд┐ рдЗрд╕ рдПрдХ рдРрдб-рдСрди (рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд╕рд╛рде 5453) рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЧрдИ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЗрди рдЪреАрдЬреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ рдХреБрдЫ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдм рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рддрдХ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдШрдЯрдирд╛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдирд╣реАрдВ рдЖрдИ рд╣реИ:
declare function f<G extends (...args: any[]) => R, R extends <T>(foo: T) => Bar<T>>(g: G): typeof R(baz); // error following the expression-based proposal: R is not exposed at the expression level
ред рдпреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ G
, рд▓реЗрдХрд┐рди afaik рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдм рддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рд╢рд╛рдпрдж # 14400?) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдгрд┐рдд рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред@Igorbek рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ:
function use<T>(item: typeof someFunctionWithComplexReturnTypeThatUsesGenerics<T>(item)) { ... }
рдпрд╣ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред
@masaeedu рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛:
($#$ someFunctionWithComplexReturnTypeThatUsesGenerics
$#$ рдХреЗ рдмрдЬрд╛рдп f
рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ)
function use<T>(item: typeof f<T>(undefined as any as T)) { ... }
рдмрд╕ рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирдХрд▓реА рдЪрд░ рдкреЗрд╢ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
const _typeofItem = f<T>(undefined as any as T); // no T here
function use<T>(item: typeof _typeofItem) { ... }
BTW, рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рджрд╕реНрдп рдкреНрд░рдХрд╛рд░ рдХреНрд╡реЗрд░реА рдкреНрд░рдХрд╛рд░ рдСрдкрд░реЗрдЯрд░ T[K]
рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ typeof
рдХреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ:
typeof x[K]
рдХрд╛ рдЕрд░реНрде рд╣реИ (typeof x)[K]
рдЬрд╣рд╛рдВ K
_is_ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИtypeof x[k]
рдХрд╛ рдЕрд░реНрде рд╣реИ (typeof x)[k]
рдЬрд╣рд╛рдВ k
рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ; рдпрд╛typeof x[k]
рдХрд╛ рдЕрд░реНрде рд╣реИ typeof (x[k])
рдЬрд╣рд╛рдВ k
рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ typeof (x[k])
рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдордХрдХреНрд╖ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реИред
рдЬрдм рдореИрдВрдиреЗ рдХреНрд░реЛрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓реНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рджрд╕реНрдп рдСрдкрд░реЗрдЯрд░ рдХреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рд╡рд╣ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рдорд┐рд▓рд╛?
@Igorbek : рд╣рд╛рдБ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреЛрд╕реНрдЯ рд╕реЗ type Thing2Type = typeof things['thing-2'];
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@dehli : рдЖрдк JS рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдХреА рддреБрд▓рдирд╛ TS рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░/рдиреЛрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЯреАрдПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВред
рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ typeof
рдХреЛ рдЗрдВрдбреЗрдХреНрд╕реЗрдб рдЯрд╛рдЗрдк рдПрдХреНрд╕реЗрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗред (рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред)
@ tycho01 рдЧреЛрдЪрд╛ ред рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ TS JS рдХреЗ рд╕рдорд╛рди рд╡рд░реАрдпрддрд╛ рдХреЗ рдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
@dehli рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕реНрддрд░ рд╕рдорд╛рди рд╣реИ, рд╣рд╛рдБред рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдпрд╣ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред
рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЙрди рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд▓реНрдкрдирд╛ рдХреА рдереАред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдпрджрд┐ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИ рддреЛ рд╡реЗ рд╡рд┐рдЪрд╛рд░ рдЕрдм рдЙрддрдиреЗ рд╕рдордЭрджрд╛рд░ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддреЗред
рдПрдХ рдЕрдиреНрдп рдиреЛрдЯ рдкрд░, рдпрджрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рддреЛ рдХреЛрд╖реНрдардХ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рд╕реНрддрд░ рдкрд░ рд╣реЛрдВрдЧреЗред рдореБрдЭреЗ рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ рдЬреЛ рд╕рдордЭреМрддрд╛ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рд╛рдБред
@Igorbek рдХреНрдпрд╛ рдпрд╣ рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ typeof
рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИ? рдЕрдЧрд░ рд╣рдореЗрдВ #14400 рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ рддреЛ рдпрд╣ рд╣рдореЗрдВ рд╕рд╛рджреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ returnof
рджреЗрдЧрд╛ред
returnof
рдирд╣реАрдВ рджреЗрдЧрд╛:type Return<T extends () => R, R = any> = R;
// overloaded function
declare function f(item: number): number;
declare function f(item: string): boolean;
type fType1 = Return<typeof f>; // ??
type fType2 = typeof f(1); // number
type fType3 = typeof f('a'); // boolean
// generic function
declare function g<T>(item: T): T;
type gType1 = Return<typeof g>; // ??
type gType2 = Return<typeof g<number>>; // not supported syntax
type gType3 = typeof g(1); // number
type gType4 = typeof g<number>(1); // number
type gType5 = typeof g('a' as 'a'); // 'a'
рдореБрдЭреЗ рд╢реЗрд╖ рд╕рднреА рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдЕрднреА рддрдХ рдЦреЛрдЬреЗ рдирд╣реАрдВ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдкрд░рд╛рдЬреЗрдп рдФрд░ рдЖрдХрд░реНрд╖рдХ рд╣реИрдВ:
typeof
рдорд╛рдирдХ рдЕрдзрд┐рднрд╛рд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛; @ tycho01 рдиреЗ promised
рдкреНрд░рдХрд╛рд░ PR #17077 . рдореЗрдВ рдПрдХ рд╕реБрдВрджрд░ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ рд╣реИ@masaeedu : рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдлреА рд╣рдж рддрдХ @Igorbek рдиреЗ рдХрд╣рд╛ рд╣реИ; рд╣рд▓ рдХреА рдЧрдИ рдареЛрд╕ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ #16392 рдореЗрдВ рдореЗрд░реА 'рд╢реАрд░реНрд╖ рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ' рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА рдорд┐рд▓реЗрдЧреА, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЕрдирд╕реБрд▓рдЭреА рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреЛ рдЙрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:
ReturnType
рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПредreduce
/ map
/ filter
/ find
рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреБрдЫ рднреА рдЬрд┐рд╕рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдЬрд╛рдВрдЪ рд╢рд╛рдорд┐рд▓ рд╣реИред stdlib.d.ts
рд╕реЗ рд╡рд╣рд╛рдВ рд▓рд╛рдн рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдПрдлрдкреА рд░рд╛рдорджрд╛/рд▓реЛрджрд╢ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рднреА рдЗрдирдкреБрдЯ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЯреНрдпреВрдкрд▓реНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реВрдЪреА-рдЬреИрд╕реЗ рд╕рд░рдгрд┐рдпрд╛рдБ), рд▓реЗрдХрд┐рди map
рдФрд░ filter
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗрд╡рд▓ Partial
рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рд░реЗрдбрдХреНрд╕ (https://github.com/piotrwitek/react-redux-typescript/issues/1 рджреЗрдЦреЗрдВ) рдФрд░ рдПрдВрдЧреБрд▓рд░ рдХреЗ рдПрдирдЬреАрдЖрд░рдПрдХреНрд╕ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рддрдм рддрдХ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдХреЛ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП map
рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдЙрдирдХреЗ рд▓рд┐рдП DRY'er рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕реЗ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИредflatMap
рдХреЗ рд▓рд┐рдП рдЕрд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ - рдЬреИрд╕реЗ рдХрд┐ promised
рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рди0
рднрд╛рдЬрдХ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ - рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдХ, #4183 рдХрд╛ рд╡рд┐рд╖рдпред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП function div<B extends number, NotZero = { (v: '1') => 'whatever'; }({ (v: 0) => '0'; (v: number) => '1'; }(B))>(a: number, b: B)
ред рдЖрдо рддреМрд░ рдкрд░ рдЗрджрд░реАрд╕ рднрд╛рд╖рд╛ рд▓рдВрдмрд╛рдИ-рд╕реБрд░рдХреНрд╖рд┐рдд рд╡реЗрдХреНрдЯрд░/рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рдЙрдЪреНрдЪ-рдЖрджреЗрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИредUnion<T>
/ NonUnion<T>
рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ + IsUnion
редcurry
, Function.prototype.bind
, Promise.all
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИ (рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдард╛рдпрд╛)редswitch
рддрд░реНрдХ #13500 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рднрд╛рд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИpromised
), рдЙрд░реНрдл тАЛтАЛрдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ рдЯрд╛рдЗрдк рдЪреЗрдХ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИрдВредOmit
, Overwrite
#12215 рд╕реЗ), #12424 рдореЗрдВ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВtoString
, toLocaleString
) рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ toString
рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХреНрд╕реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧрдбрд╝рдмрдбрд╝рд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЬреЛ рдкрд╣рд▓реЗ рдЧреНрд▓рд┐рдЪреНрдб рдмрд┐рд▓реНрдЯ-рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдереЗредрд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд▓реЗрдЦрди рдХреЗ рд╕рдордп рд╕реЗ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ (# 21496) рд╕реЗ рднрд░реЗ рд╣реБрдП рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рдЧрдпрд╛ред
@Igorbek рдХрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдкреНрд░рдердо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ (рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдХреБрдЫ рдЕрдЬреНрдЮрд╛рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рдХреАрдордд рдкрд░ - рдореБрдЭреЗ рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдареЛрд╕ рдирд╣реАрдВ рд╕реЛрдЪрдирд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдПрдХ рдХреЛрдиреЗ рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдбрд░ рд╣реИ ) рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдореВрд▓реНрдп рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдпрд╣ #6606), рд╕реНрдкреНрд░реЗрдб/рд░реЗрд╕реНрдЯ (#5453), рдЕрднрд┐рдХрдерди рдСрдкрд░реЗрдЯрд░ !
(#17370), рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрд╛рд╡ (#4183, рдЕрдиреНрдпрдерд╛ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрдкреВрд░реНрдг рд╡реНрдпрд╛рдкрд╛рд░-рдмрдВрдж рдХреБрдЫ рдкреНрд░рд╢реНрди рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╕рднреА рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕реБрд▓рдн рдХреНрдпреЛрдВ рдмрдирд╛рддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб)ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрднрд╛рд╡рд┐рдд рдЪреБрдиреМрддреА рдХреЗ рд╕рд╛рде рдКрдкрд░ рдореЗрд░реА рддреБрд▓рдирд╛ рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред
2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдпрд╣рд╛рдВ рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЖрдкрдХреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХреБрдЫ null &
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рдмрд┐рдирд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЯреАрдПрд╕ рдХреЛ рдЕрднреА рд╡рд╛рдкрд╕ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рд╡реЗрд╢ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬреНрдЮрд╛рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред .
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЕрд▓рдЧ .d.ts
рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП TS рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рди рдХреЗрд╡рд▓ stdlib.d.ts
рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдореВрд▓ JS рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА DT рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ, рдЬреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрдмрдХрд┐ JS libs рдлрд╝реНрд▓реЛ рдЬреИрд╕реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЦреБрд▓рд╛ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
(рдпрд╣ .ts
рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИ, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдУрдкреА рдХреЗ 'рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб' рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд▓рд┐рдЦрдирд╛ред)
@ tycho01 рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж; рд╡рд╣рд╛рдБ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓рд┐рдВрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдкрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдкрд░ рднреА рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ #6606 рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ рднреНрд░рдо рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдФрд░ #6606 рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдВ:
typeof K[L]
рд╕реЗ рдкрд╣рд▓реЗ) рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИрдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп-рд╕реНрддрд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛, рдЗрдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдХреЗ рднрд╛рд╡ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ (a: A) => B
рдпрд╛ A | B
рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ Func<A, B>
, Union<A, B>
рдЬреИрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЪреАрдиреА рдереЗ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдХрд░рдг рдереЗ (HKTs, fundeps рдпрд╛ рдЯрд╛рдЗрдк рдкрд░рд┐рд╡рд╛рд░, рдЖрджрд┐)ред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕реБрджреГрдврд╝рддрд╛ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдзреНрдпрд╛рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдмрд╣реБрдд рд╕реА рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреА рд╣реИрдВред рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдФрдкрдЪрд╛рд░рд┐рдХрддрд╛, рдФрд░ рдпрд╛рдВрддреНрд░рд┐рдХ рдирд┐рдпрдореЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ (рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ, рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд┐рдВрдЧ рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░реЗрдЧрд╛ред
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп-рд╕реНрддрд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛, рдЗрдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдХреЗ рднрд╛рд╡ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред
рдУрд╣, рд╣рд╛рдБ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореВрд▓реНрдп-рд╕реНрддрд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдпрд╣ рд╕рдм рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдореВрд▓реНрдп рд╕реНрддрд░ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛрддрд╛, рддреЛ рдореИрдВ рд╕реНрд╡рдпрдВ рдпрд╣рд╛рдБ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЖрдзрд╛рд░рд┐рдд рд╢рд┐рд╡рд┐рд░ рдореЗрдВ рд╣реЛрддрд╛ред :рдкреА
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдВрдХреАрд░реНрдг рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ (рдХреНрдпрд╛ рдЯреАрд╕реА39 рдЯреАрдПрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ?), рдФрд░ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрддреНрдХреГрд╖реНрдЯ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ (рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред
рд╣реЗрдХ, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдЧрд╛ред
рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдПрдлрдкреА libs рдЗрддрдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рдПрдВ рдХрд┐ рдЯреАрдПрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦ рд╕рдХреЗрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдиреБрдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреНрдпрд╛рд▓ рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред
TS рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ (рдкреНрд░рдореБрдЦ рдЙрджрд╛рд╣рд░рдг #12215 рдХрд╛ Overwrite
/ Omit
рд╣реИ) рдЖрдХрд╕реНрдорд┐рдХ рд╡реЗрдм рджреЗрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд░реЙрдХреЗрдЯ рд╕рд╛рдЗрдВрд╕ рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдмрд┐рд▓реНрд▓реА, рдпрд╣ рд╣рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рднреА рд▓реЗ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдЕрднреА рддрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк/рдЗрдВрдбреЗрдХреНрд╕/рдкреНрд░рддреАрдХ -рдкреНрд░реВрдл рднреА рдирд╣реАрдВ рд╣реИрдВред
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ (рдП: рдП) => рдмреА рдпрд╛ рдП | рдлрдВрдХ , рдпреВрдирд┐рдпрди рдЬреИрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдЬреНрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдмреА рдЪреАрдиреА рдереЗ
рд╣рдо рдЗрд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдлрд╝реНрд▓рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░рдпреБрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдЙрдкрдирд╛рдо/рдкреНрд░рдХрд╛рд░ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред Foo<Bar>
рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХреА рдЪреАрдЬрд╝ рдПрдХ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВ - рдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ stdlib.d.ts
рдХрд░рддрд╛ рд╣реИ -- рдЖрдкрдХреЗ рдкрд╛рд╕ foo[]
рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ Array<Foo>
рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ Array.prototype
рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐:
type Union2<A, B> = A | B;
type TuplizeA<Tpl extends Union2<any, any>, A, B> = [Tpl[0], Tpl[1]];
// ^ sorry, no way to access union members through e.g. [0]
// type a = TuplizeA<1 | 2>;
type TuplizeB<Tpl extends any | any> = [Tpl[0], Tpl[1]];
// ^ sorry, no way to access union members through e.g. [0]
// type b = TuplizeB<1 | 2>;
type TuplizeC<Tpl extends Union2<A, B>, A, B> = [A, B];
type c = TuplizeC<1 | 2>;
// ^ need 3 arguments, maybe fixable with #14400
type TuplizeD<Tpl extends A | B, A, B> = [A, B];
// ^ need 3 arguments, maybe fixable with #14400
type d = TuplizeD<1 | 2>;
рддреЛ рдЙрдо рд╣рд╛рдБ, рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рд╣реИ рдХрд┐ рдХреНрдпреВрдм рдХрд╛ # 14400 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЖрдЬ рднреА рдкрд╣рд▓реЗ рд╡рд╣рд╛рдБ рджреЗрдЦрд╛ рдерд╛!
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╣реА рдмрд╛рдд - рдЬреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рд╣реИ рдХрд┐ # 14400 рди рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдмрд▓реНрдХрд┐ рдкрд░рдо рдкреНрд░рдХрд╛рд░ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЗрд╕ рд╕рдордп рдУрд╡рд░рд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдХреЗрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рдБред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрди #6606 рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд╡рд╛рд▓реЗ рдУрд╡рд░рд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд░рд┐рдЯреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВред
рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдордирдорд╛рдирд╛ рдЖрджреЗрд╢ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдФрд░ рдПрдХ рд╕реБрдВрджрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕/рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐/рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
!
(#17370): рдЗрд╕рдХреЗ рдмрд╛рдж #6606 рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!
рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛, рдЗрд╕ #6606 рдХреЗ рд╕рд╛рде рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП NotZero
рдКрдкрд░)редArrayLike
s, рдореЗрд░реЗ рд╕рд╛рд░ рдореЗрдВ List
рд╕рдВрдЪрд╛рд▓рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ #6606 рдХреЗ рд╕рд╛рде рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдиреБрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдкреИрд░рд╛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрд╡реЗрджрди рдХреЗ рд╕рдордп рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрд╛рдиреА рдЙрдирдХреЗ рд╕рдЯреАрдХ рдЗрдирдкреБрдЯ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдЕрднреА рднреА 5453 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАредрд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдЧрд░ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬрдореАрди рдкрд░ рд╣реЛрддрд╛, рддреЛ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рдмреАрдЪ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдВрддрд░ рдпрд╣рд╛рдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рд╕реНрд╡рд╛рдж рд╡рд╛рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдУрд░ рдПрдХ рдмрдбрд╝рд╛ рдмрдбрд╝рд╛ рддрд░реНрдХ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЕрдЧрд░ 5453 рднреА рдЕрдВрджрд░ рд╣реЛрддреЗ, рддреЛ рдореИрдВ рдЕрдм рд╡рд╣рд╛рдВ рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛ред рдФрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреБрд░реНрд▓рдн рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред
рдЕрдм, рдПрдХ рддрд░реНрдХ рдЬреЛ рдЕрднреА рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рд╕реНрд╡рд╛рдж рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рдорд┐рд░рд░рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрдХрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЗрдПрд╕ (рдмрд┐рдирд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ) рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рддрд╣рдд рдЙрдЬрд╛рдЧрд░ рд╣реЛрдЧреАред рд╕реАрдЦрдиреЗ рдХреА рдЕрд╡рд╕реНрдерд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ред
2 рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдореБрдЭреЗ рдЕрднреА-рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдкрд░ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдиреЗ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЪрд╛рд▓, 1 as any as MyType
, рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХрд╛ рд╢рд╛рдпрдж рдпрд╣ рдЕрд░реНрде рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╕реНрд╡рд╛рджреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдХреНрд╖рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдорд╛рди рд▓рдЧрддреА рд╣реИ, рдмрд╛рд╣рд░реА рдЕрдВрддрд░ рдЬреНрдпрд╛рджрд╛рддрд░ typeof myVar
(рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд╛рдж) рдмрдирд╛рдо myVar
(рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡рд╛рдж) рд╕реЗ рдорд┐рд▓рдХрд░ рдХрд╛рд░реНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ; рдЙрдирдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MyType
(рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рд╛рдж) рдмрдирд╛рдо 1 as any as MyType
(рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡рд╛рдж, рд╡реИрдХрд▓реНрдкрд┐рдХ declare let a: any;
рдлрд┐рд░ <MyType>a
)ред
рдпрд╛ рддреЛ рдПрдПрд╕рдЯреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рдлреА рдкреНрд░рдмрдВрдзрдиреАрдп рд▓рдЧрддреЗ рд╣реИрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡рд╛рдж рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореВрд▓реНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ typeof
рд╕рдВрдпреЛрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ; рдЯрд╛рдЗрдк рдлреНрд▓реЗрд╡рд░ рдореМрдЬреВрджрд╛ рдлрдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ ( fn<T>(arg)
) рдХреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╕реЗ рдЯрд╛рдЗрдк рд▓реЗрд╡рд▓ рддрдХ рдХреЙрдкреА рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд░рдпрд╛рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрдм рдирд┐рдореНрди рдкрд░ рдЖрддрд╛ рд╣реИ:
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛:
typeof expr
TS рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдЖрдЧреЗ рдмрд┐рдирд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ JS рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рдердкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛:
MyType
рдХреЗ рдмрдЬрд╛рдп 1 as any as MyType
: рдЖрдкрдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдореЗрдВ рдЖрдкрдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдореЗрдВ рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрддрд░ рдирд╣реАрдВ рд╣реИредрдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╖рдп рдЕрдм рддрдХ рдпрд╣рд╛рдВ рдЕрдЫреВрддрд╛ рд░рд╣ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░-рд╕реНрддрд░реАрдп рдлрд╝рдВрдХреНрд╢рди 'рдПрдкреНрд▓рд┐рдХреЗрд╢рди' рдореЗрдВ this
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЕрдм, рдЬреЗрдПрд╕ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЗрд╕реЗ Function.prototype
рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИ, рдЙрдирдореЗрдВ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рд░реИрдВрдбрдо рдЙрджрд╛рд╣рд░рдг рд╕рд┐рдВрдЯреИрдХреНрд╕, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ F
(this: Foo, a: number, b: string) => SomeReturnType
рдЬрд┐рд╕реЗ рдЕрдиреНрдпрдерд╛ F(MyA, MyB)
: F(this: MyFoo, MyA, MyB)
рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
this
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЕрднреА рднреА F(MyA, MyB)
рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ this
рддрд░реНрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕реНрддрд░ред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ:
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╡рд┐рдкрдХреНрд╖:
рддреЛ, рдкрддрд╛ рдЪрд▓рд╛, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИ!
рдЬреНрдпрд╛рджрд╛ рдЙрддреНрддреЗрдЬрд┐рдд рди рд╣реЛрдВред
@DanielRosenwasser рдиреЗ рдореБрдЭреЗ рд╕рд┐рд░реНрдл # 12146 рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛, рдПрдХ рдмрдЧ рдЬреЛ рд╢рд╛рдмреНрджрд┐рдХ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
_5 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж_
рддрд╛ рджрд╛рд╣! рдПрдХ рднрдпрд╛рдирдХ рдмреБрд░реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдХрднреА рднреА рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпрд╣ рд▓реБрднрд╛рд╡рдирд╛ рд╣реИ ...
interface String {
passthrough<T>(v: T): T;
}
// All work
type ANumber = "".passthrough(10 * 10);
type AString = "".passthrough("hello" + "world");
type AHelloWorld = "".passthrough("hello world");
type AnArbitraryThing = "".passthrough(Object.assign({hello: "world"}, {foo: "bar"}));
type ThisCraziness = "".passthrough((() => "cows are big dogs"));
~рдЗрд╕рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ Effort: Difficult
рдереЛрдбрд╝рд╛ рд╕рдВрджрд┐рдЧреНрдз рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдХрд┐рдпрд╛ рдерд╛ред ~ рдореИрдВ рдФрд░ рдкрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ _is_ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдордЬрд╝реЗ рдХрд░реЛ @ tycho01ред
@TheOtherSamP рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.4.2 рдХреЗ рд╕рд╛рде рдЖрдЬрдорд╛рдпрд╛ рдФрд░ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ any
ред
@pelotom рд╣реБрд╣, рдпрд╣ рдпрд╣рд╛рдБ 2.4.2 рдФрд░ 2.5.0-dev.20170803 рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓рдХреНрд╖реНрдп ES6 рдФрд░ рд╕рдЦреНрдд рдореЛрдбред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИред #17628
@TheOtherSamP рдирд╣реАрдВ, рдХреЛрдИ рдкрд╛рд╕рд╛ рдирд╣реАрдВред рдУрд╣ рдЕрдЪреНрдЫрд╛ред
@pelotom рдпрд╣ рдЕрдЬреАрдм рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред
@TheOtherSampP : рд╣рд╛рд╣рд╛, рдпрд╣ рдмрд╣реБрдд рдордЬрд╝реЗрджрд╛рд░ рд╣реИред
рд╕рдордп-рд╕рдордп рдкрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдУрд╣ рдЕрдЪреНрдЫрд╛ред
@рдкреЗрд▓реЛрдЯреЙрдо :
рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 2.4.2 рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЙрдирдХрд╛ рд╕реНрдирд┐рдкреЗрдЯ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди (2.3.2) рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рд╣рд╛рд▓ рд╣реА рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ ( ^2.5.0-dev.20170626
) рдореБрдЭреЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рднреА рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИред
рдЗрд╕рд╕реЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░
Effort: Difficult
рдереЛрдбрд╝рд╛ рд╕рдВрджрд┐рдЧреНрдз рджрд┐рдЦрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдХрд┐рдпрд╛ рдерд╛ред
рд╡реЗ рдПрдХ рдкреНрд░рдХрд╛рд░-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ (-> +
, Object.assign
, рдЖрдЧреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
@ tycho01 I _think_ рдпрд╣ рд╕рдм рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ #7618 рдореЗрдВ рдЗрд╕ рдУрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖред рдУрд╣ рдареАрдХ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдЕрд░реНрдз-рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдПрдЧрд╛ред
рд╡реЗ рдПрдХ рдкреНрд░рдХрд╛рд░-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди, рдЬрдмрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ (-> +, рдСрдмреНрдЬреЗрдХреНрдЯ.рдЕрд╕рд╛рдЗрди, рдЖрдЧреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рдБ, рдореИрдВ рдПрдХ рдореВрд░реНрдЦ рдерд╛ рдФрд░ рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рдмрд╛рдж рддрдХ рдЗрд╕ рдкреВрд░реЗ рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ред рдпрд╣ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ, рдХрд┐ рд╢рд╛рдпрдж рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред рдореИрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдмрд╣реБрдд рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╛ рддреЛ рдпрд╣ рдпрд╛ #12424 рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рдЦреЛрд▓реЗрдЧрд╛ред
#17961 рдкрд░ рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рдЦреЛрд▓рд╛ред
@yortus рдХреНрдпрд╛ рдпрд╣ 'рдЯрд╛рдЗрдкреЛрдлрд╝ рд▓рд┐рдЯрд░рд▓' рдХрд╛ рдХрд╡рд░ рдХреЗрд╕ рд╣реИ?
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдЬ "const x: typeof 1 = 1;" рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
@ рдПрдирдПрди --- рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ 'рдЕрдиреБрдореЛрджрд┐рдд' рднрд╛рдЧ рдореЗрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рдкрд╣реБрдВрдЪ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред
рднрд▓реЗ рд╣реА typeof 1
рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рд╣реЛ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ ( 1
) рдпрд╛ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдХрд╛рд░ ( number
) рджреЗрдЧрд╛ред
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдЬ "const x: typeof 1 = 1;" рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
const x: 1 = 1;
рдХреНрдпреЛрдВ рдирд╣реАрдВ?
@SaschaNaz рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛
const a = {q:1};
const b = {q:1};
const x: ReadonlyArray<typeof a> = [a,b];
рд▓реЗрдХрд┐рди рд╕рдорд╛рди рдЕрдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
const x: ReadonlyArray<typeof 1> = [1,2,3];
@yortus рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ ..
@ рдПрдирдПрди ---: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
@ tycho01 рдлреНрд▓реЛ рдореЗрдВ рдЕрдм $Call
рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ https://github.com/facebook/flow/commit/ac7d9ac68acc555973d495f0a3f1f97758eeedb4
рдХреЗрд╡рд▓ typeof fn(...)
рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдирд╛ typeof
рдХреА рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛?
function fn() {
return /** whatever expression you like */;
}
type a = typeof fn();
рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрдм рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ?
рдЬрд╝рд░реБрд░реА рдирд╣реАрдВред рдЖрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдирд╣реАрдВред
@ dyst5422 typeof fn()
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрд╣ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рджреЗрдЧрд╛ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╢рд╛рдпрдж рдпрд╣реА рдЖрдк рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗ, рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ sky87 рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ _defining_ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛, рдЗрд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, _evaluating_ рдирд╣реАрдВред
@dyst5422 , рдЬреИрд╕рд╛ рдХрд┐ @pelotom рдиреЗ рдХрд╣рд╛, рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдпрджрд┐ рдЖрдк typeof
рдХреА рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ typeof
рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░реВрдВрдЧрд╛ рднрд╛рд╡ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд╕рдХреВрдВред рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрджрд╕реВрд░рдд рд╣реИ рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
const dummy = (false as true) && /* arbitrary exp */;
type TypeOfExp = typeof dummy;
рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдореИрдВ рдХреМрди рд╕рд╛ рд╣реИрдХ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ typeof
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реЛрдЧреАред
рдЖрд╣, рдореИрдВ рдЕрдм рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдиреЗ рдХрд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╣реЛрдЧрд╛
type TypeOfExp = typeof (
false &
"false" &
0
)
рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП
рдХреНрдпрд╛ new
рдЖрдордВрддреНрд░рдг рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐рд╕реА рднреА PromiseConstructorLike
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдЬреИрд╕реЗ $q рдпрд╛ рдмреНрд▓реВрдмрд░реНрдб) рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдПрдХ рд╡рд╛рджрд╛ рджреЗрддрд╛ рд╣реИред
declare function wait<P extends PromiseConstructorLike>(time: number, implementation: P): typeof new implementation<void>((res: any, rej: any) => void);
const bluebirdPromise = wait(1e3, Bluebird);
// typeof bluebirdPromise should be instance of Bluebird
рдХреНрдпрд╛ typeof
рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛рдЫ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдпрд╛ рд╣рдореЗрдВ null as FnType
рдХрд░рдирд╛ рд╣реЛрдЧрд╛?
interface Fn {
(a: string): string;
(a: number): boolean;
}
type Ret = Fn(number); // Ret = boolean
type Ret = typeof (null as Fn)(number);
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рдкрд╣рд▓реЗ рд╣реА рджрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ; рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛ред
рдпрд╣рд╛рдБ new
рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ typeof implementation()
рдирд╣реАрдВ рдЪрд╛рд╣реЗрдВрдЧреЗ?
рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ implementation()
рдПрдХ рд╡реИрдз рдХреЙрд▓ рдирд╣реАрдВ рд╣реИред PromiseConstructorLike
рдХреЗрд╡рд▓ new
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред typeof implementation()
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реИ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ (typeof implementation)['foobar']
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред
рдХреНрдпрд╛ рдлрд╝реНрд▓реЛрдЯрд╛рдЗрдк рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬреИрд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
type _ExtractReturn<B, F: (...args: any[]) => B> = B;
type ExtractReturn<F> = _ExtractReturn<*, F>;
@Cryrivers : рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП #14400 рджреЗрдЦреЗрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдЗрдирдкреБрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЬ рдлрд┐рд░ рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдорд┐рд▓реЗрдЧреАред
рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд TS 2.8 рдореЗрдВ ReturnType<T>
рдСрдкрд░реЗрдЯрд░ рдХреЛ lib.d.ts
рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЪреВрдВрдХрд┐ ReturnType<T>
рдХреЛ рдЕрднреА рддрдХ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реИ, рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдлрд╝реНрд▓реЛ рдХрд╛ $Call
рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ @goodmind , рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред
рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЯреАрдПрд╕ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ (рдпрд╛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЙрд▓ рд╡реНрдпрд╛рдЦреНрдпрд╛) рдХреЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреА рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред
рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрдм #21496 рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,... рд╡реЗ рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП curry
, рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд░рдЪрдирд╛, map
, reduce
, рд▓реИрдореНрдмреНрдбрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд▓реЗрдВрд╕ рд╕рдВрдкрд╛рджрди... рдордЬреЗрджрд╛рд░ рд╕рд╛рдордЧреНрд░реАред :)
рдкреАрдПрд╕ @ рдХрд╛рдВрдЯрд╛0 : рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдгреАрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рдЕрдм ReturnType
(#21496) рд╕реЗ рднрд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░реЛрдк2: рдЯрд╛рдЗрдкрдСрдлрд╝ this.prop1.big.complex;
@mhegazy рдХреНрдпрд╛ рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкреЛрдлрд╝ рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬрдмрдХрд┐ рд╕реНрдереИрддрд┐рдХ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
class A {
x: number;
static y: number;
f() {
const a: number = 1;
const b: typeof a = 2; // OK
const c: this.x = 3; // No :(
const d: this['x'] = 3; // OK
const e: typeof A.y = 4 // OK
}
}
@ рдПрдирдПрди --- рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
this['x']
@ рдХреИрдорд░реВрди-рдорд╛рд░реНрдЯрд┐рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди
@ tycho01 рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдФрд░ рд╕рд╢рд░реНрдд рднрдпрд╛рдирдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдХрд┐ рд╡реЗ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ typeof
рдХреА рддрд░рд╣ рдХреБрдЫ рдЪрд╛рд╣рд┐рдПред
@NN рдмрд╕ const d: this['x'] = 3;
. рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдУрд╣ рдЕрдЪреНрдЫрд╛ :)
@ рдПрдирдПрди --- рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
class A {
x: number;
static y: number;
f() {
const self = this;
const a: number = 1;
const b: typeof a = 2; // OK
const c: typeof self.x = 3; // OK
const d: typeof self['x'] = 3; // OK
const e: typeof A.y = 4 // OK
}
}
@tsofist рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдмрджрд╕реВрд░рдд рд▓рдЧрддрд╛ рд╣реИред
рдпрд╣ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреИрдкреНрдЪрд░ рдХреЗ рд╕рд╛рде рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп 'рдлрд╝рдВрдХреНрд╢рди() {}' рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рдмрдЪрдд 'рдпрд╣' рдЬреИрд╕рд╛ рд╣реА рд╣реИред
@рдПрдирдПрди
рдпрд╣ рдмрджрд╕реВрд░рддред
рд╣рд╛рдБ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ :)
рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдЕрдм рдЗрд╕реЗ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреНрдп рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде ReturnTypeOf<T>
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рддрд░реНрдХреЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡реЗ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
@RyanCavanaugh рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм ReturnType<T>
рд╣реИ?
@RyanCavanaugh рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ - рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рд╡рд╣ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдХреНрдпрд╛ рд╕рд╢рд░реНрдд/рдЕрдиреБрдорд╛рди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ?
рдЖрдкрдХреЛ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
type Return1<A1, T extends (a: A1) => any> = T extends (a: A1) => infer R ? R : any;
type Return2<A1, A2, T extends (a: A1, a: A2) => any> = T extends (a: A1, a: A2) => infer R ? R : any;
declare function something(a: number): number;
declare function something(a: string): string;
declare function something(a: number, b: string): boolean;
type A = Return1<number, something>; // number
type B = Return1<string, something>; // string
type C = Return2<number, string, something>; // boolean
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рд╣рд╛рдпрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
@ForbesLindesay : something
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рд╕реНрддрд░ рдЪрд░ рд╣реИ - рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП typeof
рдпрд╣рд╛рдВ (рдпрд╛ рдЗрд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛) рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдЙрдЪрд┐рдд рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ 2.8.0-dev.20180318
рдкрд░)ред
@ForbesLindesay рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдЕрдиреБрдорд╛рди рддрдВрддреНрд░ _last_ рд╡рд┐рдзрд┐ рдЕрдзрд┐рднрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛:
type Funcs = ((p1: string, p2: string) => void) & ((p1: number) => void);
type FuncPromise1<T> = T extends (p1: infer P1) => void ? (p1: P1) => Promise<[P1]> : never;
type FuncPromise2<T> = T extends (p1: infer P1, p2: infer P2) => void ? (p1: P1, p2: P2) => Promise<[P1, P2]> : never;
let foo: FuncPromise1<Funcs> & FuncPromise2<Funcs>;
рд╣рд╛рд▓рд╛рдВрдХрд┐ , рдЕрдиреБрдорд╛рди рддрдВрддреНрд░ _is_ рдЯрдкрд▓ рдпреВрдирд┐рдпрдиреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ:
type Tuples = [string, string] | [number];
type TuplePromise1<T> = T extends [infer P1] ? (p1: P1) => Promise<[P1]> : never;
type TuplePromise2<T> = T extends [infer P1, infer P2] ? (p1: P1, p2: P2) => Promise<[P1, P2]> : never;
let foo: TuplePromise1<Tuples> & TuplePromise2<Tuples>;
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдУрд╡рд░рд▓реЛрдб -> рдСрдмреНрдЬреЗрдХреНрдЯ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди -> рдСрдмреНрдЬреЗрдХреНрдЯ, рдЕрд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд╣рд┐рдПред рд╡рд╣рд╛рдВ рдЯрд╛рдЗрдк рдореИрдкрд┐рдВрдЧ рдФрд░ рдЗрдВрдЯреНрд░реЗрдВрд╕ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХ рдлрдВрдХреНрд╢рди рдФрд░ рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рдмреИрдХ рдЕрдк рд▓реЗрдВред
@MeirionHughes :
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдУрд╡рд░рд▓реЛрдб -> рдСрдмреНрдЬреЗрдХреНрдЯ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди -> рдСрдмреНрдЬреЗрдХреНрдЯ, рдЕрд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд╣рд┐рдПред рд╡рд╣рд╛рдВ рдЯрд╛рдЗрдк рдореИрдкрд┐рдВрдЧ рдФрд░ рдЗрдВрдЯреНрд░реЗрдВрд╕ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХ рдлрдВрдХреНрд╢рди рдФрд░ рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рдмреИрдХ рдЕрдк рд▓реЗрдВред
рдЬреИрд╕реЗ (a: number, b?: string) => boolean
-> { a: number, b?: string }
? рд╣рдо рдЕрднреА рддрдХ рдЙрд╕ рддрд░рд╣ рдХреЗ рдкрд░рдо рдирд╛рдо рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдпрд╣ рдмрд╛рдХреА рдкреИрд░рд╛рдо ( (a: number, ...b: string[]) => boolean
) рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдСрд░реНрдбрд░ рд╢рд╛рдпрдж рдирд╛рдореЛрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдкреИрд░рд╛рдореНрд╕ рдФрд░ рдЯреБрдкрд▓реНрд╕ рдХреЗ рдмреАрдЪ рдХрдирд╡рд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкреНрд░реЗрдб/рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрднреА рднреА рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдУрд╡рд░рд▓реЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдУрд╡рд░рд▓реЛрдб ((a: number) => 123) & ((s: string) => 'hi')
рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЪреМрд░рд╛рд╣реЗ рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрдкрд▓ рдкреНрд░рдХрд╛рд░) рдХреЛ рдХреИрд╕реЗ 'рдЦреЛрд▓реЗрдВ' - рдЕрднреА рддрдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╣ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рдкрде рдЕрд╕рдВрддреЛрд╖рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рднрд╛рд░ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдЧрд╛, рдлрд┐рд░ рднреА рдЬреЗрдирд░рд┐рдХ рдирд╣реАрдВ рдХрд╣реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рд╛рдБред рдЪреМрд░рд╛рд╣рд╛ рдЦреЛрд▓рдирд╛ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрдВрддрд░ рдерд╛ред
рдЪреВрдВрдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрдм рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЕрдм рднреА рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реИрдВ? рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рддрд░рд╣?
рдЪреВрдВрдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрдм рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рдЕрдм рднреА рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реИрдВ?
рдХреЛрдИ рдирд╣реАрдВ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЕрд╡рдЧрдд рд╣реВрдВред
рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреА рддрд░рд╣?
рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЙрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдХреНрдпрд╛ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рд▓реЗрд╡рд▓ рдлрдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдорд░реНрдерди рд╣реИ? рдореИрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд░рд╛рд╕реНрддрд╛ рд╣реИред
type MyType<A> = {
foo: A
}
type Wrap = {
<T>(maybe: MyType<T>): MyType<T>;
(maybe: any): MyType<any>;
}
type Naive = ReturnType<Wrap>; // Naive = { foo: any }
type Proposed1 = Wrap(maybe: number); // Proposed1 = { foo: number }
type Proposed2 = Wrap(maybe: MyType<number>); // Proposed2 = { foo: number }
type Proposed3 = (<T>(maybe: T) => MyType<T>)(maybe: number) // Proposed3 = { foo: number }
рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЗ:
const foo = <T>(a: T) => T:
type Edge1 = (typeof foo)(a: number) // Probably trivial?
type Foo = {
<T>(a: string): T
}
type Edge2 = Foo<number>(a: string) // Should this be allowed? Probably not, because:
type Bar<A> = {
(a: string): A
}
type Edge3 = Bar<number>(a: string) // Things are getting strange
interface Baz<A> {
<T>(a: T): T | A
}
type Edge4 = Baz<number>(a: string) // What is this?
рдХреНрдпрд╛ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдк рд▓реЗрд╡рд▓ рдлрдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдорд░реНрдерди рд╣реИ? рдореИрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛ред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд░рд╛рд╕реНрддрд╛ рд╣реИред
рдлрд┐рд▓рд╣рд╛рд▓ рдирд╣реАрдВред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдЪреНрдЪ-рдХреНрд░рдо-рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рди рдореЗрдВ рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд▓реНрдХрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░реВрдк рд╕реЗ рддрд░реНрдХ, рдЖрджрд┐ред рд╕рдордп рд╣реИред
# 24897 рдореЗрдВ рд╣рд╛рд▓рд┐рдпрд╛ рдХрд╛рдо рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП @mhegazy рдиреЗ рдЗрд╕ рдкрд░ рдЯреАрдо рдХрд╛ рд░реБрдЦ рдмрд┐рд▓реНрдХреБрд▓ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ ??
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ $Call
рдкреНрд░рдХрд╛рд░ рддрдХ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ $Call
рдкреНрд░рдХрд╛рд░ рдЙрдЪреНрдЪ-рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рджреНрд╡рд╛рд░ рдЦреЛрд▓ рджреЗрдЧрд╛; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://gist.github.com/hallettj/0fde5bd4c3ce5a5f6d50db6236aaa39e рджреЗрдЦреЗрдВ ( $PropertyType
рдФрд░ $ObjMap
рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ $#$ $Call
$#$ рд╕реЗ рдмрджрд▓реЗрдВ)ред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг: https://github.com/facebook/flow/issues/30#issuecomment -346674472
рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдпрдХреАрдирди рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЯреНрд░реИрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧреА, рдирд╣реАрдВ?
рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдЕрдм рдЗрд╕реЗ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреНрдп рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде
ReturnTypeOf<T>
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рддрд░реНрдХреЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕реЗрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡реЗ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
@RyanCavanaugh @mhegazy
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо User.avatar
рд╕реЗ User extends { avatar: infer T } ? T : never
рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ рддреЛ рдпрд╣ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдирд╣реАрдВ рд▓рд╛рдПрдЧрд╛? рддреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
export type Avatar = User extends { avatar: infer T } ? T : never;
рдЬреИрд╕рд╛
export type Avatar = User.avatar;
рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдХреБрдЫ рдбреЗрдЯрд╛ рд▓реЛрдб рдФрд░ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ findUser рдЗрд╕ рддрд░рд╣
export function findUser() {
return {
username: 'johndoe',
avatar: {
lg: '1.jpg',
s: '2.jpg'
},
repos: [
{
name: 'ts-demo',
stats: {
stars: 42,
forks: 4
},
pull_requests: [
{ date: '2019-08-19', tags: ['bug', 'agreed-to-cla'] },
{ date: '2019-08-10', tags: ['bug', 'includes-tests'] },
{ date: '2019-08-07', tags: ['feature'] }
]
}
]
};
}
рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
export type User = ReturnType<typeof findUser>;
export type Avatar = User extends { avatar: infer T } ? T : never;
рд╕реБрдЭрд╛рд╡: рдпрд╣ рдЙрд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
export type Avatar = User.avatar;
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдо рдпрд╣ рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ User.avatar
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП never
ред
рдФрд░ рдЬреНрдпрд╛рджрд╛ рдЙрджрд╛рд╣рд░рдг
export type Repositories = User extends { repos: infer T } ? T : never;
export type Repository = User extends { repos: (infer T)[] } ? T : never;
export type RepositoryStats = Repository extends { stats: infer T } ? T : never;
export type PullRequests = Repository extends { pull_requests: (infer T)[] } ? T : never;
export type PullRequest = Repository extends { pull_requests: (infer T)[] } ? T : never;
export type Tags = PullRequest extends { tags: infer T } ? T : never;
export type Tag = PullRequest extends { tags: (infer T)[] } ? T : never;
export type Repositories = User.repos;
export type Repository = User.repos[];
export type RepositoryStats = User.repos[].stats;
export type PullRequests = User.repos[].pull_requests;
export type PullRequest = User.repos[].pull_requests[];
export type Tags = User.repos[].pull_requests[].tags;
export type Tag = User.repos[].pull_requests[].tags[];
рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ
export type Tag2 = User extends { repos: { pull_requests: { tags: (infer T)[] }[] }[] } ? T : never;
рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╕рд╛рдл рд╣реЛ рдЬрд╛рдПрдЧрд╛
export type Tag = User.repos[].pull_requests[].tags[];
export class Hello {
static world = 'world';
world = 42;
}
export type ThisWillBeANumber = Hello extends { world: infer T } ? T : never;
export type ThisWillBeANumber = Hello.world;
export type ThisWillBeAString = (typeof Hello) extends { world: infer T } ? T : never;
export type ThisWillBeAString = (typeof Hello).world;
@lukaselmer рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдмрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
export type Avatar = User["avatar"];
рдЬреЛ рдЖрдЬ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
@lukaselmer рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдмрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
export type Avatar = User["avatar"];
рдЬреЛ рдЖрдЬ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдареАрдХ рдпрд╣реА рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред рдореИрдВ рдЗрд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЦреЛрдЬ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╢реБрдХреНрд░рд┐рдпрд╛!
рдХреНрдпрд╛ рдпрд╣ рдкреБрд╕реНрддрд┐рдХрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ? рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрдСрдл рдЧрд╛рд░реНрдб рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ 2015 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрд╛рдЙрдВрд╕ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореВрд▓ рд▓рдХреНрд╖реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдПрдХрд▓ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ред
interface a {
foo: bar;
/* more types */
}
const example = (fooNeeded: [magic] a.foo ) => {};
рдХреНрдпрд╛ рдореИрдВ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реВрдВ рдХрд┐ 5 рд╕рд╛рд▓ рдмрд╛рдж рднреА рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?
@MFry рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: a['foo']
рдХреНрдпрд╛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?
рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:
declare function something<A, B>(): void;
type Payload = string;
const hello = something<{}, Payload>();
declare function doThing<T extends ReturnType<typeof something>>(arg: T): { payload: unknown };
doThing(hello).payload === 123; // this should validate to a string aka type Payload
https://www.typescriptlang.org/play/index.html?ts=4.0.0-dev.20200512#code/CYUwxgNghgTiAEAzArgOzAFwJYHtXwGccBbEDACy1QHMAeAQQBp4AhAPgAoBKALngDccWYAG4AUGIwBPAA4IAClCkQcUYPAC8hDDCrVxYsHgIZ45EBBWbCJMpRq0A3gF9mi5auCcuB0JFgIKOjYePDAOAAq9nQR8CAAHhggqMAE8ABKZMgwqBGyILTScjiINqQUemycsNR8EbzwjvAySipqfGgA1qg4AO74zr6R0RzmljhcAHQtHmqaGloAjABMAMwi8AD0m -AVaQTkOMgQ6vxQEMJQSbs48FDaujR3nfdFCq2eYkA
рд╣рд╛рдп @maraisr рдореИрдВ 100% рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ something
рджреЛ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ hello
рдХрд┐рд╕реА рдЪреАрдЬ рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ void
рд╣реЛрдЧрд╛; рддреЛ doThing
рдХрднреА рднреА рдХрд┐рд╕реА рднреА рдмрд┐рдВрджреБ рдкрд░ string
рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред
рд╢рд╛рдпрдж рдиреАрдЪреЗ рдЬреИрд╕рд╛ рдХреБрдЫ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
declare function something<ReturnType>(): ReturnType;
type Payload = string;
const hello = () => something<Payload>();
declare function doThing<F extends () => any>(f: F): { payload: ReturnType<F> };
doThing(hello).payload === 'a string';
рдЖрд╣ рд╣рд╛рдБ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рддрддреНрдкрд░ рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!! :100: @ acutmore
void
рдХреЗрд╡рд▓ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ рдХрд┐ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рд╡реЗ 2 рдкреНрд░рдХрд╛рд░ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдВрддрддрдГ рддрд░реНрдХреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
declare function something<A, B>(a: MyComplexGeneric<A>, b: B[]): { somethingA: number, somethingB: number };
// Those 2 generics influence the return object so they do get used as such. And the 2 arguments are roughly that. Its an object and an array, more-or-less.
рдореЗрд░рд╛ doThing
рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ ( A
) рдЬреЗрдиреЗрд░рд┐рдХ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ ( B
) рдХреНрдпрд╛ рд╣реИред
рджреЗрдЦреЗрдВ рдХрд┐ something
рдореЗрд░реЗ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХреЗрд╕ рдореЗрдВ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ doThing
рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдореИрдВ рдмрд╕ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ - рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ рдЪреВрд╕рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред
рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╢реНрди рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдореЗрд░реА рдпрд╛рддреНрд░рд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ!
@maraisr рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдпрджрд┐ рдЖрдк doThing
рдХреЛ $#$ something
$#$ рд╕реЗ рдореВрд▓ B
рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ hello
рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗрд╡рд▓ hello
рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдорджрдж рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ something
рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИред
рдпрд╣ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
/** Create a type that can store some extra type information **/
interface SomethingResult<T> {
__$$__: T;
somethingA: number;
somethingB: number;
}
declare function something<A, B>(): SomethingResult<B>;
type Payload = string;
const hello = something<{}, Payload>();
declare function doThing<Result extends SomethingResult<any>>(arg: Result): { payload: Result['__$$__'] };
doThing(hello).payload === 1123; // error because `payload` is of type string
interface User {
avatar: string;
}
interface UserData {
someAvatar: User['avatar'];
}
@RyanCavanaugh рдпрд╣ рдмрдВрдж рдХреНрдпреЛрдВ рд╣реИ? рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рдФрд░ рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╕рдВрднрд╡ рдмрдирд╛ рджреЗрдЧрд╛ред
рдореИрдВ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ "рдкреЙрдЗрдВрдЯ-рдлреНрд░реА" рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг: [].map(() => n > 5)
map(() => n > 5)([])
рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЧрд╛рдпрдм рд╣реИ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдФрд░ infer
рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ unknown
рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреЗред
рдЕрдЧрд░ рдореИрдВ рдкреНрд░рдХрд╛рд░ ( typeof myFunc(() => Either<string,number>)
) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ "рдХреЙрд▓" рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрд╕рдВрднрд╡ рд╣реИ) рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдПрдЪрдХреЗрдЯреА, рдЖрджрд┐ .. ред)
рдХреНрдпрд╛ $Call
рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдЬреИрд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ) рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИред
@nythrox рд╣рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рднреНрд░рдо рдЬреЛ рдЗрд╕рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрди рдорд╛рдорд▓реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ рдХрд╣реАрдВ рдФрд░ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдУрдкреА рдореЗрдВ "рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ" рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред
@RyanCavanaugh рдУрд╣ рдареАрдХ рд╣реИ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХреМрди рд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣реА рд╣реИрдВ?
рдореИрдВрдиреЗ рдереЛрдбрд╝реА рдЦреЛрдЬ рдХреА рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ; рдореБрдЭреЗ рдЬреЛ рдорд┐рд▓рд╛ рдЙрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдВрджрд░реНрдн # 20352 рдореЗрдВ рдерд╛, рдЬреЛ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рдХреЙрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓рд╛ рдХрд╣реАрдВ рдФрд░ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
@RyanCavanaugh рдорди рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдЬреБрдбрд╝ рд░рд╣рд╛ рд╣реИ? рдореИрдВ
@tjjfvi #37181 рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред
@acutmore рдЬреЛ рдХреБрдЫ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ рдЙрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣рдж рддрдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╡рд╛рд╣-рдПрд╕реНрдХреНрдпреВ $Call
рдЙрдкрдпреЛрдЧрд┐рддрд╛, рдпрд╛ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
#17961 рдкрд░ рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рдЦреЛрд▓рд╛ред