Typescript: рдкреНрд░рд╕реНрддрд╛рд╡: рдЯрд╛рдЗрдкреЛрдлрд╝ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

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

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ: npm install yortus-typescript-typeof

рдЕрдВрддрд░ рджреЗрдЦреЗрдВ: рдпрд╣рд╛рдБ ред

рд╕рдорд╕реНрдпрд╛ рдкрд░рд┐рджреГрд╢реНрдп

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдиреБрдорд╛рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдРрд╕реА рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рдВрдХрд▓рдХ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

рдореЗрд░реЗ рдкрд╛рд╕ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рд▓реЗрдХрд┐рди рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдЕрдЬреНрдЮрд╛рдд/рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рдореИрдВ рддрддреНрд╡ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдХреИрд╕реЗ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ? (#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 }));
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
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд╛рдиреАрдп/рдЕрдЬреНрдЮрд╛рдд/рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдХреИрд╕реЗ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ? (#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);
}
function augmentAPI(api: MyAPI /* ERROR */) {...}
рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЬрдЯрд┐рд▓ рдЕрдирд╛рдо рдЖрдХрд╛рд░ рд╡рд╛рд▓рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдореИрдВ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рдЙрдк-рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? (#4555, #4640)
// 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
Suggestion Too Complex

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

#17961 рдкрд░ рдПрдХ рдЬрдирд╕рдВрдкрд░реНрдХ рдЦреЛрд▓рд╛ред

рд╕рднреА 157 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡реАрдПрд╕ рдХреЛрдб рдореЗрдВ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рддреНрд╡рд░рд┐рдд рддрд░реАрдХрд╛ рдЪрд╛рд╣рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд░реЗрдкреЛ рд╣реИ ред

рдЯрд╛рдЗрдк рдкреА = рдЯрд╛рдЗрдкреЛрдл рдлреВ (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 рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕реЗрдб рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХреЗред
  • рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп (рдЪрд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ _psuedocalls_ / _psuedoarguments_ рдХрд╣рддреЗ рд╣реИрдВ), 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
  1. рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ 15 рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рд╕рд╛рде рд╣реА рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдзрд┐рднрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП typeof рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рд╣рдо рд╢рд╛рдпрдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ?

    type MyAPI = typeof myAPIFactory(...);
    
  2. рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрдкрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

    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 рдПрдХреНрд╕реЗрд╕ рдкреНрд░рдХрд╛рд░_ рдЕрднреА рдХрд░реЗрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреБрдЫ рдкреНрд░рд╢реНрди / рд╕рдВрджреЗрд╣ рдЕрднреА рднреА рдмрдиреЗ рд╣реБрдП рд╣реИрдВ:

  • рдХреНрдпрд╛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХреБрдЫ рдЕрдиреНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдЬреИрд╕реЗ _indexed access type_ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧреА? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?
  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдЖрдо рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ "рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рддреЛ рд╢рд╛рдпрдж рдХреБрдЫ рдкрд░рд┐рдЪрдп рдЗрд╕рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ рдареАрдХ рд░рд╣реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 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 рд╣рд╛рдБ, рдореИрдВ рдирд┐рд░рд╛рд╢ рдерд╛ рдХрд┐ рдЗрд╕рдиреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджрд╛ рдЦреЛрд▓рд╛ рд╣реИ:

14400

рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдбрдореА рдкрд░рд┐рд╡реЗрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрдорд╛рди рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдкрд░рд┐рд╡реЗрд╢ 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: рдареАрдХ рд╣реИ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЕрдм рдореЗрд░реА рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рд╣реИред рдЕрдиреБрдорд╛рди рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдЕрдкрдЧреНрд░реЗрдб рджреВрд░ рд╕реЗ рднреА рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

wat

@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]) рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдордХрдХреНрд╖ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдХреНрд░реЛрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓реНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рджрд╕реНрдп рдСрдкрд░реЗрдЯрд░ рдХреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рд╡рд╣ рдЖрдкрдХреЛ рдХрд╣рд╛рдВ рдорд┐рд▓рд╛?

image

@Igorbek : рд╣рд╛рдБ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдкреЛрд╕реНрдЯ рд╕реЗ type Thing2Type = typeof things['thing-2']; рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@dehli : рдЖрдк JS рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реНрддрд░ рдХреА рддреБрд▓рдирд╛ TS рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░/рдиреЛрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЯреАрдПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВред

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

@ tycho01 рдЧреЛрдЪрд╛ ред рдореИрдВрдиреЗ рдорд╛рди рд▓рд┐рдпрд╛ рдерд╛ рдХрд┐ TS JS рдХреЗ рд╕рдорд╛рди рд╡рд░реАрдпрддрд╛ рдХреЗ рдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

@dehli рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕реНрддрд░ рд╕рдорд╛рди рд╣реИ, рд╣рд╛рдБред рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдпрд╣ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЪреАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЙрди рд╕реАрдорд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рдирдХреА рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрд▓реНрдкрдирд╛ рдХреА рдереАред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдпрджрд┐ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИ рддреЛ рд╡реЗ рд╡рд┐рдЪрд╛рд░ рдЕрдм рдЙрддрдиреЗ рд╕рдордЭрджрд╛рд░ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддреЗред

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

@Igorbek рдХреНрдпрд╛ рдпрд╣ рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ typeof рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИ? рдЕрдЧрд░ рд╣рдореЗрдВ #14400 рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ рддреЛ рдпрд╣ рд╣рдореЗрдВ рд╕рд╛рджреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ returnof рджреЗрдЧрд╛ред

14400 рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ 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'

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

  • _рдХрдВрдбреАрд╢рдирд▓ рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░_ рдЬреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ #12424 рдХреЗ рд╕рд╛рде рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ 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 рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕реЗ рдЯрд╛рдЗрдк рд╕реНрддрд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
  • рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдлрдВрдХреНрд╢рди рдХрдВрдкреЛрдЬрд┐рд╢рди рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЗрдирдкреБрдЯ-рдирд┐рд░реНрднрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦ рдкрд╛ рд░рд╣реА рд╣реИред
  • рдпрд╣ рдЕрдЪрд╛рдирдХ рд▓реЗрдВрд╕ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдирд╛ рджреЗрдЧрд╛ред - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣ рдЕрднреА рднреА рдЗрдирдкреБрдЯ-рдирд┐рд░реНрднрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдкрд╛рджрди рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдЕрд╡рд░реБрджреНрдз рд╣реИред рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд▓рд╛рд╕рд┐рддрд╛ рд╣реИред рдЯреБрдкрд▓реНрд╕ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА (рд╣рд┐рд╕реНрд╕рд╛) # 5453 рдХреА рдЬрд░реВрд░рдд рд╣реИред
    рдпрд╣ рднреА рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ:
  • рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдмреВрд▓рд┐рдпрди рдЕрдХреНрд╖рд░ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛, рдЬреЛ рдЕрдм рддрдХ рдЕрд╕рдВрднрд╡ рд░рд╣рд╛ рд╣реИ
  • flatMap рдХреЗ рд▓рд┐рдП рдЕрд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ - рдЬреИрд╕реЗ рдХрд┐ promised рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рди
  • рдЯрд╛рдЗрдк/рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛, # 15347 рдХрд╛ рд╡рд┐рд╖рдп рдФрд░ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореБрдЭреЗ 'рдЗрджрд░реАрд╕ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд╛рд╕' рдкреБрд╕реНрддрдХ рд╕реЗ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдорд┐рд▓рд╛ред рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 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 ред - рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреНрд░рдо рдЯреВрдЯ рдЧрдпрд╛ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдм рдХреИрд╕реЗ рдЬрд╛рдирд╛ рд╣реИред
  • #5453 рднреА рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ curry , Function.prototype.bind , Promise.all рдЬреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИ (рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╕реВрдЪреА рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдард╛рдпрд╛)ред
  • switch рддрд░реНрдХ #13500 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рди рдЕрдзрд┐рднрд╛рд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • рд╡реЗ рдореИрдк рдХрд┐рдП рдЧрдП рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ рдЬреЛ #12424 рдФрд░ #17077 ( promised ), рдЙрд░реНрдл тАЛтАЛрдЯрд╛рдЗрдк-рд▓реЗрд╡рд▓ рдЯрд╛рдЗрдк рдЪреЗрдХ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рднрд▓реЗ рд╣реА рд╡рд╣ рдЖрдЬ рдХрд╣реАрдВ рднреА рдмреВрд▓рд┐рдпрди рд╢рд╛рдмреНрджрд┐рдХ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ, рдЬрдм рддрдХ рдХрд┐ рдЗрд╕ # 6606 рднреВрдорд┐ рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреВрд▓рд┐рдпрди рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ / рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛ред рд╡реИрд╕реЗ рднреАред
  • рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдкреВрд░реЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ (рдЬреИрд╕реЗ 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 рдкреИрдЯрд░реНрди-рдорд┐рд▓рд╛рди рд╡рд╛рд▓реЗ рдУрд╡рд░рд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрд░рд┐рдЯреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрди рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрди рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВред
рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЯреБрдкрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдордирдорд╛рдирд╛ рдЖрджреЗрд╢ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдФрд░ рдПрдХ рд╕реБрдВрджрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕/рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЙрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐/рдкреНрд░рдХрд╛рд░ рд╕реНрддрд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

  • рд╕рдорд╛рд░реЛрд╣ рдЖрд╡реЗрджрди: рдпрд╣ #6606
  • рдЕрднрд┐рдХрдерди рдСрдкрд░реЗрдЯрд░ ! (#17370): рдЗрд╕рдХреЗ рдмрд╛рдж #6606 рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдШрдЯрд╛рд╡ (#4183): рдКрдкрд░ ! рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛, рдЗрд╕ #6606 рдХреЗ рд╕рд╛рде рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП NotZero рдКрдкрд░)ред
  • рд╕реНрдкреНрд░реЗрдб/рд░реЗрд╕реНрдЯ (#5453) - рднрд▓реЗ рд╣реА рдЯреБрдкрд▓реНрд╕ рдХреЛ рдЙрд╕ рднреВрдорд┐ рддрдХ рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдорд╛рди 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 рдФрд░ рд╕рдЦреНрдд рдореЛрдбред

image

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реА рдЧрд▓рддреА рд╣реЛ рд╕рдХрддреА рд╣реИред #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>;

image

рд╣рд╛рд▓рд╛рдВрдХрд┐ , рдЕрдиреБрдорд╛рди рддрдВрддреНрд░ _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>;

image

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдУрд╡рд░рд▓реЛрдб -> рдСрдмреНрдЬреЗрдХреНрдЯ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди -> рдСрдмреНрдЬреЗрдХреНрдЯ, рдЕрд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд╣рд┐рдПред рд╡рд╣рд╛рдВ рдЯрд╛рдЗрдк рдореИрдкрд┐рдВрдЧ рдФрд░ рдЗрдВрдЯреНрд░реЗрдВрд╕ рдХрд░реЗрдВ, рдлрд┐рд░ рдПрдХ рдлрдВрдХреНрд╢рди рдФрд░ рдУрд╡рд░рд▓реЛрдб рдореЗрдВ рдмреИрдХ рдЕрдк рд▓реЗрдВред

@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 рдЙрдкрдпреЛрдЧрд┐рддрд╛, рдпрд╛ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдЬреАрдм рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

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

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

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

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

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

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

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