
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЕрдкрдиреЗ рдШрд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЦрд░рд╛рдмреА рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдПрдХ рдЧрд▓рддреА рджреЗрдЦреА рдЬреЛ рдЕрдХреНрд╕рд░ рдердХрд╛рди рдХреЗ рдХрд╛рд░рдг рджреЛрд╣рд░рд╛рддреА рд╣реИред рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдХреЛрдб рдмреНрд▓реЙрдХ рдореЗрдВ рдХрдИ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдиреЗ рдкрд░, рдЬрдм рдореИрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдмрддрдЦ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдЖрдЗрдП рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
class Car { id: number; numberOfWheels: number; move (x: number, y: number) {
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдирд╛рдордорд╛рддреНрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ, рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЙрдирдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЧрддрддрд╛ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреА рд╣реИред рдХрд╛рд░ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдмреЛрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рднреА рдЧреБрдг рдФрд░ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░ рдХреЛ рдмреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЛрдЯ рд╕рдЪ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирд╛рд╡ рдХреЗ рдкрд╛рд╕ рдирдВрдмрд░рдСрдлрд╡реНрд╣реАрд▓ рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред
рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ
type CarId: number; type BoatId: number;
рдФрд░ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ред
class Car { id: CarId; numberOfWheels: number; move (x: number, y: number) {
рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдмрд╣реБрдд рдирд╣реАрдВ рдмрджрд▓реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ рдЖрдк рд╕рд╣реА рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдлрд╛рдпрджреЗ рджреЗрддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЕрдЪрд╛рдирдХ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ VIN рдирдВрдмрд░ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рдЖрдкрдХреЛ рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде, рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬрд╣рд╛рдВ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рд╕реЗ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реИрдВ:
function getCarById(id: CarId): Car {
рддрдм рд╣рдореЗрдВ рд╕рдВрдкрд╛рджрдХ рд╕реЗ рдПрдХ рд╕рдВрдХреЗрдд рдорд┐рд▓реЗрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдПрдХ рдирдВрдмрд░, рдмрд▓реНрдХрд┐ CarId рдпрд╛ BoatId рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ
рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЛрдИ рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЧреБрдг рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдЯреНрд░рд┐рдХ рдХреЛ рдмреНрд░рд╛рдВрдбрд┐рдВрдЧ рд╢рдмреНрдж рдХреЗ рддрд╣рдд рдЕрдВрдЧреНрд░реЗрдЬреА-рднрд╛рд╖рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рдкрд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
type BoatId = number & { _type: 'BoatId'}; type CarId = number & { _type: 'CarId'};
рдпрд╣ рдмрддрд╛рддреЗ рд╣реБрдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдПрдХ рд╡рд╕реНрддреБ рджреЛрдиреЛрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рд╣рдордиреЗ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рдВрдЧрдд рдмрдирд╛ рджрд┐рдпрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
let carId: CarId; let boatId: BoatId; let car: Car; let boat: Boat; car = getCarById(carId);
рдЕрдВрддрд┐рдо рдЪрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
function makeCarIdFromVin(id: number): CarId { return vin as any; }
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд░рд╣реЗрдЧрд╛ред
рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдХрдо рд╕рдЦреНрдд рд╣реИ
рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореБрдЭреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЖрдк рдлреНрд▓реЗрд╡рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
interface Flavoring<FlavorT> { _type?: FlavorT; } export type Flavor<T, FlavorT> = T & Flavoring<FlavorT>;
рдЕрдм рдЖрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
type CarId = Flavor<number, тАЬCarIdтАЭ> type BoatId = Flavor<number, тАЬBoatIdтАЭ>
рдЪреВрдВрдХрд┐ _type рдЧреБрдг рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рдЖрдк рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
let boatId: BoatId = 5; // OK let carId: CarId = 3; // OK
рдФрд░ рд╣рдо рдЕрднреА рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
let carId: CarId = boatId; // ERROR
рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдирд╛ рд╣реИ
рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдмреНрд░рд╛рдВрдбрд┐рдВрдЧ рдХреЛ рдПрдХ рдЪрд░ рдХреЛ рд╕реАрдзреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЕрдЧрд░ рдЪрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрд┐рд╕реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдирд┐рд░рдкреЗрдХреНрд╖ рдлрд╝рд╛рдЗрд▓ рдкрде, рджрд┐рдирд╛рдВрдХ рдпрд╛ рдЖрдИрдкреА рдкрддрд╛ред рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдлреНрд▓реЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
- рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ stackoverflow.com
- рд▓реЗрдЦ рдХреА рдирд┐: рд╢реБрд▓реНрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛