Typescript: рд╕рднреА рдпреВрдирд┐рдпрди рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдШ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдирд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

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

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 2.1.1

рдХреЛрдб

type A = { a: string; } 
type B = { b: string; }
type AorB = A | B;

declare const AorB: AorB;

if (AorB.a) {
    // use AorB.a
}

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░:
рдХреЛрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рднрд▓реЗ рд╣реА a (рдЬрд░реВрд░реА рдирд╣реАрдВ) рд╕рдВрдШ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдкрд░ рдореМрдЬреВрдж рд╣реИ, рдпрд╣ рддрдереНрдп рдХрд┐ рдпрд╣ рдХреБрдЫ рдкрд░ рдореМрдЬреВрдж рд╣реИ, рдореБрдЭреЗ .a рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ рдпрджрд┐ рдореМрдЬреВрдж рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ: "рд╕рдВрдкрддреНрддрд┐ рдПрдУрдЖрд░рдмреА рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ ... рд╕рдВрдкрддреНрддрд┐ рдмреА рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред"

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

рдореБрдЭреЗ рдкреБрд╕реНрддрдХ рдкрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ:

interface A { x:  number;} 
interface B { y:  string;}
function doStuff ( q: A | B ) {
  if ( 'x'  in q) {
    //  if type A...
  }
  else {
    // if type B...
  }
}

рдЕрдВрд╢: рдмрд╕рд░рдд рдЕрд▓реА рд╕реИрдпрдж "рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреАрдк рдбрд╛рдЗрд╡ред" Apple рдкреБрд╕реНрддрдХреЗрдВред

рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

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

рдбреЙрдХреНрдЯрд░ рдХрд╣рддреЗ рд╣реИрдВ:

рд╕рдорд╛рди рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

let pet = getSmallPet();

if ((<Fish>pet).swim) {
    (<Fish>pet).swim();
}
else {
    (<Bird>pet).fly();
}

http://www.typescriptlang.org/docs/handbook/advanced-types.html

рдлрд┐рд░ рдЕрдкрдиреЗ рдирдореВрдиреЗ рдореЗрдВ:

if ((<A>AorB).a) {
    // use AorB.a
}

рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ B a рд╕рдВрдкрддреНрддрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ a рд╕рдВрдкрддреНрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЧреБрдгреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ B рд░реВрдк рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ b рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ)ред рдЖрдк рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ a: undefined рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ B (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ B рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ a рд╕рдВрдкрддреНрддрд┐):

type A = { a: string; } 
type B = { b: string; a: undefined }
type AorB = A | B;

declare const AorB: AorB;

if (AorB.a) {
    // Ok
}

рдПрдХрджрдо рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рджрд┐рдорд╛рдЧрд╝ рдХрд╛ рджрд╣реАред

рдпрджрд┐ рдЖрдк B рдХреЛ a: undefined рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЪрд░ рдмрдирд╛рддреЗ / рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ undefined рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк a рдХреЛ a?: undefined рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

рдпрджрд┐ рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓реЗрдХрд┐рди рдлреЗрдВрдХрддрд╛ рд╣реИ; рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛): рдХреНрдпрд╛ рдпрд╣ рдмрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВ? ЁЯдФ

type LinkProps = {
    to: string;
    onClick?: undefined;
    // Link specific props:
    target: string;
}

type ButtonProps = {
    to?: undefined;
    onClick: Function;
    // Button specific props:
    disabled: boolean;
}

type ActionProps = LinkProps | ButtonProps;

const Action = (props: ActionProps) =>
    props.to ?
        'Link with target: ' + props.target // Error not on ButtonProps
    :
        'Button with disabled: ' + props.disabled; // Error: not on LinkProps

Action({
  to: 'dssd',
  target: '_blank'
});

рдореБрдЭреЗ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдпрджрд┐ (A.a) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП if ((<A>AorB).a) рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк A рд╡рд╛рдкрд╕ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдпрджрд┐ рдЖрдк B рдХреЛ a: undefined рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЪрд░ рдмрдирд╛рддреЗ / рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ undefined рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЙрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк a рдХреЛ a?: undefined рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЦреБрд╢ рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред

рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ a?: never , рдЕрдм рдЖрдк рдЧрд▓рддреА рд╕реЗ undefined рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

рдпрджрд┐ рдЖрдк рд╕рдВрдШ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? (рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЦрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ, рдХреНрдпрд╛ рдореИрдВ рдКрдкрд░ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ?)

type u = "str" | {prop:"val"};
function f(arg:u){return arg.prop} // TypeScript: Property 'prop' does not exist on type 'u'

рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди?

рдореБрдЭреЗ рдкреБрд╕реНрддрдХ рдкрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ:

interface A { x:  number;} 
interface B { y:  string;}
function doStuff ( q: A | B ) {
  if ( 'x'  in q) {
    //  if type A...
  }
  else {
    // if type B...
  }
}

рдЕрдВрд╢: рдмрд╕рд░рдд рдЕрд▓реА рд╕реИрдпрдж "рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреАрдк рдбрд╛рдЗрд╡ред" Apple рдкреБрд╕реНрддрдХреЗрдВред

рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

type ColorItemType = {
    colorId: number,
    colorName: string,
}

type NumItemType = {
    numId: number,
    numName: string
}

type ResType = {
    itemId: number,
    // 0 color 1 num
    type: number,
    itemInfo: {
        colorList: Array<ColorItemType>
        numList: Array<NumItemType>
    }
}

const request = () => {
    return [{
        itemId: 1,
        type: 0,
        itemInfo: {
            colorList: [{
                colorId: 1,
                colorName: 'blue'
            }],
            numList: []
        }
    }];
};

const dataSource: Array<ResType> = request();

const formatData = dataSource.map(dataItem => {
    const list: Array<ColorItemType | NumItemType> = dataItem.type === 1 ? dataItem.itemInfo.numList : dataItem.itemInfo.colorList;
    return list.map(listItem => {
        return {
            // An error will be reported here
            value: listItem.numId || listItem.colorId,
            label: listItem.numName || listItem.colorName
        };
    });
});

рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ B a рд╕рдВрдкрддреНрддрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ a рд╕рдВрдкрддреНрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЧреБрдгреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ B рд░реВрдк рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ b рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ)ред рдЖрдк рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ a: undefined рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ B (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ B рдХреБрдЫ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ a рд╕рдВрдкрддреНрддрд┐):

type A = { a: string; } 
type B = { b: string; a: undefined }
type AorB = A | B;

declare const AorB: AorB;

if (AorB.a) {
    // Ok
}

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ 07.10.2020

рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдХрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреА рдмрд╣реБрдд рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ...

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

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

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

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

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

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

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