рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд╕реНрдХрд░рдг: 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
рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ рдпрджрд┐ рдореМрдЬреВрдж рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░:
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИ: "рд╕рдВрдкрддреНрддрд┐ рдПрдУрдЖрд░рдмреА рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ ... рд╕рдВрдкрддреНрддрд┐ рдмреА рдкрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред"
рдбреЙрдХреНрдЯрд░ рдХрд╣рддреЗ рд╣реИрдВ:
рд╕рдорд╛рди рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
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
рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдХрд╛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреА рдмрд╣реБрдд рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ...
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореБрдЭреЗ рдкреБрд╕реНрддрдХ рдкрд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ:
рдЕрдВрд╢: рдмрд╕рд░рдд рдЕрд▓реА рд╕реИрдпрдж "рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреАрдк рдбрд╛рдЗрд╡ред" Apple рдкреБрд╕реНрддрдХреЗрдВред
рдПрдХ рд╡рд╕реНрддреБ рдкрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред