Typescript: рд╕реБрдЭрд╛рд╡: рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░

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

рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗрд╡рд▓ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдпрд╛ рддрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ) рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

let fontStyle: 'normal' | 'italic' = 'normal'; // already available in master
let fontColor: /^#([0-9a-f]{3}|[0-9a-f]{6})$/i = '#000'; // my suggestion

рд╕реАрдПрд╕рдПрд╕ рдиреЛрдЯреЗрд╢рди рдореЗрдВ рд░рдВрдЧ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдЖрдо рдмрд╛рдд рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдбреАрдУрдПрдо рдиреЛрдбреНрд╕ рдпрд╛ рд╡рд┐рднрд┐рдиреНрди рддреГрддреАрдп рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕реАрдПрд╕рдПрд╕ рд╢реИрд▓реА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЗрдВред

рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?

Literal Types Needs Proposal Suggestion

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

рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡

рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдЕрдзрд┐рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдЬреИрд╕реЗ рд╕реАрдПрд╕рдПрд╕ рд░рдВрдЧ, рдИрдореЗрд▓, рдлреЛрди рдирдВрдмрд░, рдЬрд╝рд┐рдкрдХреЛрдб, рд╕реНрд╡реИрдЧрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬреЗрд╕рди рд╕реНрдХреАрдорд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рднреА рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрдХреАрдорд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрдЯрд░реНрди рдФрд░ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ TS рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ regex-validated string type рдФрд░ regex-validated string type of index рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓рдХреНрд╖реНрдп

рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ JSON рд╕реНрдХреАрдорд╛ рдХреЗ рдХрд░реАрдм рдПрдХ рдХрджрдо рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рддреНрдпрд╛рдкрди рдЬрд╛рдВрдЪ рдХреЛ рднреВрд▓рдиреЗ рд╕реЗ рднреА рд░реЛрдХрддрд╛ рд╣реИред

рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЕрд╡рд▓реЛрдХрди

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ 4 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:

рд░реЗрдЧреЗрдХреНрд╕ рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░

type CssColor = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
type Email = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i;
type Gmail = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;

рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдЪрд░ рдкреНрд░рдХрд╛рд░

let fontColor: /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;

рдФрд░ рд╡рд╣реА, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкрдардиреАрдп

let fontColor: CssColor;

рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛

interface UsersCollection {
    [email: /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i]: User;
}

рдФрд░ рд╡рд╣реА, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкрдардиреАрдп

interface UsersCollection {
    [email: Email]: User;
}

рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЧрд╛рд░реНрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВ

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(color)) {
        fontColor = color;// correct
    }
}

рдФрд░ рд╡рд╣реА

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (!(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(color))) return;
    fontColor = color;// correct
}

рдФрд░ рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (CssColor.test(color)) {
        fontColor = color;// correct
    }
}

рдХреЗ рд╕рдорд╛рди

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (!(CssColor.test(color))) return;
    fontColor = color;// correct
}

рдЗрдВрдбреЗрдХреНрд╕ рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЧрд░рд╛рд░реНрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВ

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i.test(email)) {
        collection[email];// type is User
    }
}

рдХреЗ рд╕рдорд╛рди

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (!(/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i.test(email))) return;
    collection[email];// type is User
}

рдФрд░ рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (Email.test(email)) {
        collection[email];// type is User
    }
}

рдХреЗ рд╕рдорд╛рди

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (!(Email.test(email))) return;
    collection[email];// type is User
}

рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди

рдХрд╛рд░реНрдп

let email: Email;
let gmail: Gmail;
email = '[email protected]';// correct
email = '[email protected]';// correct
gmail = '[email protected]';// compile time error
gmail = '[email protected]';// correct
gmail = email;// obviously compile time error
email = gmail;// unfortunately compile time error too

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╣рдо рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдХрд╛рд░рдг рдХрдард┐рди рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд▓реЗ рдХрд╛рдордХрд╛рдЬ рд╣реИрдВ:

// explicit cast
gmail = <Gmail>email;// correct
// type guard
if (Gmail.test(email)) {
    gmail = email;// correct
}
// another regex subtype declaration
type Gmail = Email & /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;
gmail = email;// correct

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ string рдЪрд░ рдХреЛ regex-validated рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рднреА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ред

let someEmail = '[email protected]';
let someGmail = '[email protected]';
email = someEmail;// compile time error
gmail = someGmail;// compile time error

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

let someEmail: '[email protected]' = '[email protected]';
let someGmail: '[email protected]' = '[email protected]';
email = someEmail;// correct
gmail = someGmail;// correct

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреБрдЪрди рдЯрд╛рдЗрдк рдХрд░реЗрдВ

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ regex-validated type рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ gurard рджреЗрдЦреЗрдВред
рд▓реЗрдХрд┐рди рдФрд░ рднреА рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

type Email = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i;
type Gmail = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;
interface UsersCollection {
    [email: Email]: User;
    [gmail: Gmail]: GmailUser;
}
let collection: UsersCollection;
let someEmail = '[email protected]';
let someGmail = '[email protected]';
collection['[email protected]'];// type is User
collection['[email protected]'];// type is User & GmailUser
collection[someEmail];// unfortunately type is any
collection[someGmail];// unfortunately type is any
// explicit cast is still an unsafe workaround
collection[<Email> someEmail];// type is User
collection[<Gmail> someGmail];// type is GmailUser
collection[<Email & Gmail> someGmail];// type is User & GmailUser

рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ:

let collection: UsersCollection;
let someEmail: '[email protected]' = '[email protected]';
let someGmail: '[email protected]' = '[email protected]';
collection[someEmail];// type is User
collection[someGmail];// type is User & GmailUser

рд▓реЗрдХрд┐рди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдЧрд▓реЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣реИ:

getUserByEmail(email: string) {
    collection[email];// type is any
    if (Email.test(email)) {
        collection[email];// type is User
        if (Gmail.test(email)) {
            collection[email];// type is User & GmailUser
        }
    }
    if (Gmail.test(email)) {
        collection[email];// type is GmailUser
    }
}

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо Gmail рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рддреЛ рдпрд╣ рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдХреАрд░реНрдгрддрд╛ рд╣реЛрдЧреА:

type Gmail = Email & /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (Email.test(email)) {
        collection[email];// type is User
        if (Gmail.test(email)) {
            collection[email];// type is User & GmailUser
        }
    }
    if (Gmail.test(email)) {
        collection[email];// type is User & GmailUser
    }
}

рд╕рдВрдШ рдФрд░ рдЪреМрд░рд╛рд╣реЗ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ regex-validated рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЙрдирдХреЗ рд╕рдВрдШреЛрдВ рдФрд░ рдЪреМрд░рд╛рд╣реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВред

type Regex_1 = / ... /;
type Regex_2 = / ... /;
type NonRegex = { ... };
type test_1 = Regex_1 | Regex_2;// correct
type test_2 = Regex_1 & Regex_2;// correct
type test_3 = Regex_1 | NonRegex;// correct
type test_4 = Regex_1 & NonRegex;// compile time error
if (test_1.test(something)) {
    something;// type is test_1
    // something matches Regex_1 OR Regex_2
}
if (test_2.test(something)) {
    something;// type is test_2
    // something matches Regex_1 AND Regex_2
}
if (test_3.test(something)) {
    something;// type is Regex_1
} else {
    something;// type is NonRegex
}

рдЬреЗрдиреЗрд░рд┐рдХреНрд╕

рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП regex-validated рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП, regex-validated рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:

class Something<T extends String> { ... }
let something = new Something<Email>();// correct

рдЙрддреНрд╕рд░реНрдЬрди рдЕрд╡рд▓реЛрдХрди

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, regex-validated рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ:

type Regex_1 = / ... /;
type Regex_2 = / ... /;
type NonRegex = { ... };
type test_1 = Regex_1 | Regex_2;
type test_2 = Regex_1 & Regex_2;
type test_3 = Regex_1 | NonRegex;
type test_4 = Regex_1 & NonRegex;
if (test_1.test(something)) {
    /* ... */
}
if (test_2.test(something)) {
    /* ... */
}
if (test_3.test(something)) {
    /* ... */
} else {
    /* ... */
}

рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛:

var Regex_1 = / ... /;
var Regex_2 = / ... /;
if (Regex_1.test(something) || Regex_2.test(something)) {
    /* ... */
}
if (Regex_1.test(something) && Regex_2.test(something)) {
    /* ... */
}
if (Regex_1.test(something)) {
    /* ... */
} else {
    /* ... */
}

рд╕рдВрдЧрддрддрд╛ рдЕрд╡рд▓реЛрдХрди

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕ regex-validated рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдиреНрдп рдЯреАрдПрд╕ рдХреЛрдб рд╣реИ:

type someType = { ... };
var someType = { ... };

рдЬрдм рдиреАрдЪреЗ рдХреЛрдб рдирд╣реАрдВ рд╣реИ:

type someRegex = / ... /;
var someRegex = { ... };

рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдорд╛рдиреНрдп рдерд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░рдг рд╕реЗ (рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдЧрд▓рдд рдереА)ред
рддреЛ рдЕрдм рд╣рдореЗрдВ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрдм рдпрд╣ рдкреНрд░рдХрд╛рд░ regex-validated ред

рдкреА.рдПрд╕.

рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд╢рд╛рдпрдж рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреАрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

рд╣рд╛рдБ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рд╣реБрдП, . рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдо рд╕реЗрд╡рд╛рдУрдВ рдХреА рдкрд░рдд рдореЗрдВ ScriptElementKind рд╕рд╛рде рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрдиреНрд╣реЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  • рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрдиреНрд╣реЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред рдЕрдЧрд░ рдореБрдЭреЗ "cat" , "dog" , рдФрд░ "fish" рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рд╕реВрдЪреА рдЪрд╛рд╣рд┐рдП, рддреЛ рдореБрдЭреЗ /dog|cat|fish(,(dog|cat|fish))*/ рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

    • рдпрджрд┐ рдореЗрд░реЗ рдкрд╛рд╕ "cat" , "dog ", рдФрд░ "fish" рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рд░реЗрдЧреЗрдХреНрд╕ рдореЗрдВ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд░реВрдВ?

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

  • рдЧреИрд░-рдорд╛рдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ iffy рдмрдирд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рдкрд░ рд╡рд┐рд╢рд╛рд▓ +1, рдЬрд╝рд┐рдкрдХреЛрдб, рдПрд╕рдПрд╕рдПрди, рдУрдиреЗрдЯ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗред

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рдХрд╛рдордХрд╛рдЬ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛:
http://stackoverflow.com/questions/37144672/guid-uuid-type-in-typescript

рдЬреИрд╕рд╛ рдХрд┐ @mhegazy рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдореИрдВ

type Integer(n:number) => String(n).macth(/^[0-9]+$/)
let x:Integer = 3 //OK
let y:Integer = 3.6 //wrong

type ColorLevel(n:number) => n>0 && n<= 255
type RGB = {red:ColorLevel, green:ColorLevel, blue:ColorLevel};
let redColor:RGB = {red:255, green:0, blue:0}   //OK
let wrongColor:RGB = {red:255, green:900, blue:0} //wrong

type Hex(n:string) => n.match(/^([0-9]|[A-F])+$/)
let hexValue:Hex = "F6A5" //OK
let wrongHexValue:Hex = "F6AZ5" //wrong

рд╡рд╣ рдорд╛рди рдЬрд┐рд╕реЗ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди рджреНрд╡рд╛рд░рд╛ рд╣реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд╕реЗ #7982 рднреА рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@rylphs +1 рдпрд╣ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрддреНрдпрдВрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдмрдирд╛ рджреЗрдЧрд╛

рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ _regex-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░_ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

let a: RegExType_1
let b: RegExType_2

a = b // Is this allowed? Is RegExType_2 subtype of RegExType_1?
b = a // Is this allowed? Is RegExType_1 subtype of RegExType_2?

рдЬрд╣рд╛рдВ RegExType_1 рдФрд░ RegExType_2 _regex-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░_ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрд╣реБрдкрдж рд╕рдордп рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ (рджреЗрдЦреЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд╡реЗрд╢рди рд╕рдорд╕реНрдпрд╛ )ред

рдЯрд╛рдЗрдк рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рднреА рдорджрдж рдХрд░реЗрдЧрд╛: https://github.com/typestyle/typestyle/issues/5 :рдЧреБрд▓рд╛рдм:

JSX рдореЗрдВ , aria- (рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ data- ) рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рджреЗрдЦрд╛ рд╣реИред рдХрд┐рд╕реА рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрдЪ-рдСрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред

interface IntrinsicElements {
    // ....
    [attributeName: /aria-\w+/]: number | string | boolean;
}

рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡

рдРрд╕реЗ рдХрдИ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдЕрдзрд┐рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдЬреИрд╕реЗ рд╕реАрдПрд╕рдПрд╕ рд░рдВрдЧ, рдИрдореЗрд▓, рдлреЛрди рдирдВрдмрд░, рдЬрд╝рд┐рдкрдХреЛрдб, рд╕реНрд╡реИрдЧрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд╕рдВрдШ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬреЗрд╕рди рд╕реНрдХреАрдорд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рднреА рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИ JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрдХреАрдорд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреИрдЯрд░реНрди рдФрд░ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ TS рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ regex-validated string type рдФрд░ regex-validated string type of index рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓рдХреНрд╖реНрдп

рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ JSON рд╕реНрдХреАрдорд╛ рдХреЗ рдХрд░реАрдм рдПрдХ рдХрджрдо рд╣реИ, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рддреНрдпрд╛рдкрди рдЬрд╛рдВрдЪ рдХреЛ рднреВрд▓рдиреЗ рд╕реЗ рднреА рд░реЛрдХрддрд╛ рд╣реИред

рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЕрд╡рд▓реЛрдХрди

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ 4 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ:

рд░реЗрдЧреЗрдХреНрд╕ рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░

type CssColor = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
type Email = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i;
type Gmail = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;

рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдЪрд░ рдкреНрд░рдХрд╛рд░

let fontColor: /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;

рдФрд░ рд╡рд╣реА, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкрдардиреАрдп

let fontColor: CssColor;

рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛

interface UsersCollection {
    [email: /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i]: User;
}

рдФрд░ рд╡рд╣реА, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкрдардиреАрдп

interface UsersCollection {
    [email: Email]: User;
}

рдЪрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЧрд╛рд░реНрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВ

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(color)) {
        fontColor = color;// correct
    }
}

рдФрд░ рд╡рд╣реА

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (!(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(color))) return;
    fontColor = color;// correct
}

рдФрд░ рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (CssColor.test(color)) {
        fontColor = color;// correct
    }
}

рдХреЗ рд╕рдорд╛рди

setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (!(CssColor.test(color))) return;
    fontColor = color;// correct
}

рдЗрдВрдбреЗрдХреНрд╕ рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдЧрд░рд╛рд░реНрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВ

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i.test(email)) {
        collection[email];// type is User
    }
}

рдХреЗ рд╕рдорд╛рди

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (!(/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i.test(email))) return;
    collection[email];// type is User
}

рдФрд░ рдмреЗрд╣рддрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (Email.test(email)) {
        collection[email];// type is User
    }
}

рдХреЗ рд╕рдорд╛рди

let collection: UsersCollection;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (!(Email.test(email))) return;
    collection[email];// type is User
}

рд╕рд┐рдореЗрдВрдЯрд┐рдХ рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди

рдХрд╛рд░реНрдп

let email: Email;
let gmail: Gmail;
email = '[email protected]';// correct
email = '[email protected]';// correct
gmail = '[email protected]';// compile time error
gmail = '[email protected]';// correct
gmail = email;// obviously compile time error
email = gmail;// unfortunately compile time error too

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╣рдо рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдХрд╛рд░рдг рдХрдард┐рди рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд▓реЗ рдХрд╛рдордХрд╛рдЬ рд╣реИрдВ:

// explicit cast
gmail = <Gmail>email;// correct
// type guard
if (Gmail.test(email)) {
    gmail = email;// correct
}
// another regex subtype declaration
type Gmail = Email & /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;
gmail = email;// correct

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ string рдЪрд░ рдХреЛ regex-validated рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рднреА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ред

let someEmail = '[email protected]';
let someGmail = '[email protected]';
email = someEmail;// compile time error
gmail = someGmail;// compile time error

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

let someEmail: '[email protected]' = '[email protected]';
let someGmail: '[email protected]' = '[email protected]';
email = someEmail;// correct
gmail = someGmail;// correct

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреБрдЪрди рдЯрд╛рдЗрдк рдХрд░реЗрдВ

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ regex-validated type рдХреЗ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ gurard рджреЗрдЦреЗрдВред
рд▓реЗрдХрд┐рди рдФрд░ рднреА рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

type Email = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i;
type Gmail = /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;
interface UsersCollection {
    [email: Email]: User;
    [gmail: Gmail]: GmailUser;
}
let collection: UsersCollection;
let someEmail = '[email protected]';
let someGmail = '[email protected]';
collection['[email protected]'];// type is User
collection['[email protected]'];// type is User & GmailUser
collection[someEmail];// unfortunately type is any
collection[someGmail];// unfortunately type is any
// explicit cast is still an unsafe workaround
collection[<Email> someEmail];// type is User
collection[<Gmail> someGmail];// type is GmailUser
collection[<Email & Gmail> someGmail];// type is User & GmailUser

рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ:

let collection: UsersCollection;
let someEmail: '[email protected]' = '[email protected]';
let someGmail: '[email protected]' = '[email protected]';
collection[someEmail];// type is User
collection[someGmail];// type is User & GmailUser

рд▓реЗрдХрд┐рди рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЕрдЧрд▓реЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣реИ:

getUserByEmail(email: string) {
    collection[email];// type is any
    if (Email.test(email)) {
        collection[email];// type is User
        if (Gmail.test(email)) {
            collection[email];// type is User & GmailUser
        }
    }
    if (Gmail.test(email)) {
        collection[email];// type is GmailUser
    }
}

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо Gmail рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рддреЛ рдпрд╣ рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдХреАрд░реНрдгрддрд╛ рд╣реЛрдЧреА:

type Gmail = Email & /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@gmail\.com$/i;
getUserByEmail(email: string) {
    collection[email];// type is any
    if (Email.test(email)) {
        collection[email];// type is User
        if (Gmail.test(email)) {
            collection[email];// type is User & GmailUser
        }
    }
    if (Gmail.test(email)) {
        collection[email];// type is User & GmailUser
    }
}

рд╕рдВрдШ рдФрд░ рдЪреМрд░рд╛рд╣реЗ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ regex-validated рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЙрдирдХреЗ рд╕рдВрдШреЛрдВ рдФрд░ рдЪреМрд░рд╛рд╣реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВред

type Regex_1 = / ... /;
type Regex_2 = / ... /;
type NonRegex = { ... };
type test_1 = Regex_1 | Regex_2;// correct
type test_2 = Regex_1 & Regex_2;// correct
type test_3 = Regex_1 | NonRegex;// correct
type test_4 = Regex_1 & NonRegex;// compile time error
if (test_1.test(something)) {
    something;// type is test_1
    // something matches Regex_1 OR Regex_2
}
if (test_2.test(something)) {
    something;// type is test_2
    // something matches Regex_1 AND Regex_2
}
if (test_3.test(something)) {
    something;// type is Regex_1
} else {
    something;// type is NonRegex
}

рдЬреЗрдиреЗрд░рд┐рдХреНрд╕

рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП regex-validated рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП, regex-validated рдкреНрд░рдХрд╛рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:

class Something<T extends String> { ... }
let something = new Something<Email>();// correct

рдЙрддреНрд╕рд░реНрдЬрди рдЕрд╡рд▓реЛрдХрди

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, regex-validated рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ:

type Regex_1 = / ... /;
type Regex_2 = / ... /;
type NonRegex = { ... };
type test_1 = Regex_1 | Regex_2;
type test_2 = Regex_1 & Regex_2;
type test_3 = Regex_1 | NonRegex;
type test_4 = Regex_1 & NonRegex;
if (test_1.test(something)) {
    /* ... */
}
if (test_2.test(something)) {
    /* ... */
}
if (test_3.test(something)) {
    /* ... */
} else {
    /* ... */
}

рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛:

var Regex_1 = / ... /;
var Regex_2 = / ... /;
if (Regex_1.test(something) || Regex_2.test(something)) {
    /* ... */
}
if (Regex_1.test(something) && Regex_2.test(something)) {
    /* ... */
}
if (Regex_1.test(something)) {
    /* ... */
} else {
    /* ... */
}

рд╕рдВрдЧрддрддрд╛ рдЕрд╡рд▓реЛрдХрди

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕ regex-validated рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдиреНрдп рдЯреАрдПрд╕ рдХреЛрдб рд╣реИ:

type someType = { ... };
var someType = { ... };

рдЬрдм рдиреАрдЪреЗ рдХреЛрдб рдирд╣реАрдВ рд╣реИ:

type someRegex = / ... /;
var someRegex = { ... };

рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдорд╛рдиреНрдп рдерд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░рдг рд╕реЗ (рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдЧрд▓рдд рдереА)ред
рддреЛ рдЕрдм рд╣рдореЗрдВ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╡реЗрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрдм рдпрд╣ рдкреНрд░рдХрд╛рд░ regex-validated ред

рдкреА.рдПрд╕.

рдЙрди рдЪреАрдЬреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рд╢рд╛рдпрдж рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреАрдЖрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВ regex-validated рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреМрд░рд╛рд╣реЛрдВ рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдирд╡реАрдирддрдо рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдЙрд╕ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Design proposal рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@Igmat , рдЖрдкрдХреЗ рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдЖрдк рдЙрддреНрд╕рд░реНрдЬрди рдЕрд╡рд▓реЛрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА? рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ ... рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

@alexanderbird , рд╣рд╛рдБ, рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ regex-validated рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдирд╛ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:

let fontColor: /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
fontColor = "#000";

рдФрд░ рдЗрд╕:

type CssColor: /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
let fontColor: CssColor;
fontColor = "#000";

рдпрд╣ рдареАрдХ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "#000" рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП string рд╕реЗ regex-validated рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреБрдЪрди рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рджреЛрдиреЛрдВ рд╕реЗрдЯрдЕрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрд╛ рд╣реИ:

let someString: string;
if (/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(someString)) {
    fontColor = someString; // Ok
}
fontColor = someString; // compile time error

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

let someString: string;
let email: /^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/I;
if (/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i.test(someString)) {
    email = someString; // Ok
}
email = someString; // compile time error

рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реИред рдФрд░ рдпрд╣ рдЪреМрд░рд╛рд╣реЛрдВ рдФрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рднреА рд╣реИред рддреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ type рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

@DanielRosenwasser , рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдпрд╣рд╛рдВ рд╕рдВрджрд░реНрднрд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднреА?
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рдЪрд╛рд╣рд┐рдП ( tsc рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣ рд╕рдордЭрдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдВрджрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ рдпрд╛ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рджреГрд╖реНрдЯрд┐ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдВрдЧреЗред

рдЕрд░реЗ @Igmat , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд╢реБрд░реВ рдореЗрдВ

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

рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдЬреЛ рдореБрдЭреЗ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рд╡рд╣ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдмреИрдХрд░реЗрдлрд░реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рд╕рдордЭ (рдФрд░ рдЕрдиреБрднрд╡) рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдмреИрдХрд░реЗрдлрд░реЗрдВрд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдХреЗ рдШрд╛рддреАрдп рд╕рдордп рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдХреЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ? рд╢рд╛рдпрдж, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЯрд╛рд▓рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдкрд╛рджрдХ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рд╕реНрдерд╛рди рдкрд░ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╕рдордп рд▓рдЧрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдФрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╛ рддреЛ рдЙрд╕ рдЗрдВрдЬрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╛ рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЗрдВрдЬрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TC39 рдПрдХ рдирдпрд╛ s рдзреНрд╡рдЬ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ . рдирдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛ рд╕рдХреЗред ESXXXX рдФрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреБрд░рд╛рдиреЗ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реЛрдЧреАред

@igmat - рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд @DanielRosenwasser рдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ, рдЙрд╕рдХреА рдЖрд╡рд╛рдЬрд╝ рд╕реЗ, рдпрд╣ рд╢рд╛рдпрдж рд╡реИрд╕реЗ рднреА рд╕реНрд╡реАрдХреГрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред рдЖрдкрдиреЗ рдХрд╣рд╛

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рддрдХ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рд╣реЛрдВред рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЗ рдореЗрдВ рднреА:

function foo(bar: number) {
    let baz: /prefix:\d+/ = 'prefix:' + number;
}

рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдЦрд╛рдПрдВрдЧреЗ - рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЛрдгрд╛рддреНрдордХ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдФрд░ рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рд░реЗрдЧреЗрдХреНрд╕ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдЧрдбрд╝рдмрдбрд╝ рдФрд░ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛрддрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ рд╢рд╛рдпрдж рд╣рдо "рдЯрд╛рдЗрдк рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди: type Baz = /prefix:{number}/ ... рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рдЬрд╛рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред

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

рдирд┐рдореНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

type Color = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
let foo: Color = '#000000';
let bar: Color = '#0000'; // Error - string literal '#0000' is not assignable to type 'Color'; '#0000' does not match /^#([0-9a-f]{3}|[0-9a-f]{6})$/i
let baz: Color = '#' + config.userColorChoice; // Error - type 'string' is not assignable to type 'regex-validated-string'

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

@DanielRosenwasser , рдореИрдВрдиреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдореИрдВ рдЖрдкрдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдЧреИрд░-рд▓рдХреНрд╖реНрдпреЛрдВ # 5 рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реБрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдерд╛:

const emailRegex = /.../;
/**
 * assign it only with values tested to emailRegex 
 */
let email: string;
let userInput: string;
// somehow get user input
if (emailRegex.test(userInput)) {
    email = userInput;
} else {
    console.log('User provided invalid email. Showing validation error');
    // Some code for validation error
}

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╕реЗ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:

type Email = /.../;
let email: Email;
let userInput: string;
// somehow get user input
if (Email.test(userInput)) {
    email = userInput;
} else {
    console.log('User provided invalid email. Showing validation error');
    // Some code for validation error
}

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рдХреЛрдб рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ - рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рд╣реИред рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрдХрд╕реНрдорд┐рдХ рдЧрд▓рддреА рд╕реЗ рд░реЛрдХреЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдВрдЪрдирд╛ рднреВрд▓ рдЬрд╛рдирд╛ рдЬреЛ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рджреВрд╕рд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреБрдЪрди рдХреЗ рдмрд┐рдирд╛ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдлрд╝реАрд▓реНрдб рдХреБрдЫ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ .

@alexanderbird , рдореИрдВ рдЗрд╕ рдХреЛрдб рдХреЛ рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рджреЛрдиреЛрдВ рдореЗрдВ рдХреБрдЫ рдЫрд┐рдкреЗ рд╣реБрдП рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреЗрддрд╛ред

function foo(bar: number) {
    let baz: /prefix:\d+/ = 'prefix:' + number;
}

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдХреЛрдб рдХреЛ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣:

function foo(bar: number) {
    let baz: /prefix:\d+/ = ('prefix:' + number) as /prefix:\d+/;
}

рдпрд╛ рдпрд╣:

function foo(bar: number) {
    let baz: /prefix:\d+/;
    let possibleBaz: string = 'prefix:' + number;
    if (/prefix:\d+/.test(possibleBaz)) {
        baz = possibleBaz;
    }
}

рд╕рд╣реА рд╣реЛрдЧрд╛, рдФрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХреЛрдб рдкрд░ рднреА рдЗрд╕рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред

рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдерд╛, рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдпрд╛ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбрдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рдЙрддреНрд╕рд░реНрдЬрди рдкреНрд░рднрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдЧрд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

export type Email = /.../;
export const Email = /.../;
let email: Email;
let userInput: string;
// somehow get user input
if (Email.test(userInput)) {
    email = <Email>userInput;
} else {
    console.log('User provided invalid email. Showing validation error');
    // Some code for validation error
}

рдпрд╛ рдЪреМрд░рд╛рд╣реЛрдВ рдХреЗ рд▓рд┐рдП:

export type Email = /email-regex/;
export const Email = /email-regex/;
export type Gmail = Email & /gmail-regex/;
export const Gmail = {
    test: (input: string) => Email.test(input) && /gmail-regex/.test(input)
};
let gmail: Gmail;
let userInput: string;
// somehow get user input
if (Gmail.test(userInput)) {
    gmail = <Gmail>userInput;
} else {
    console.log('User provided invalid gmail. Showing validation error');
    // Some code for validation error
}

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛, рдЬрдм рдЗрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЙрддреНрд╕рд░реНрдЬрди рдкреНрд░рднрд╛рд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрд╛ рдХреБрдЫ рдлреАрдЪрд░ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдмрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдмрд┐рдирд╛ рдЙрддреНрд╕рд░реНрдЬрди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ regex-validated рдЯрд╛рдЗрдк рдПрдХ рд╕реНрдХреЛрдкреНрдб рд╡реЗрд░рд┐рдПрдмрд▓ рдФрд░ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЯрд╛рдЗрдк рджреЛрдиреЛрдВ рд╣реИред

@DanielRosenwasser рдФрд░ @alexanderbird рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛:

const type Email = /email-regex/;

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

const Email = /email-regex/;

рдпрд╣ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рд╕реБрдзрд╛рд░ рд╕реЗ рднреА рдмрдбрд╝рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг Redux рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╣реИ):

export type SOME_ACTION = 'SOME_ACTION';
export const SOME_ACTION = 'SOME_ACTION' as SOME_ACTION;

рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

export const type SOME_ACTION = 'SOME_ACTION';

рдореИрдВрдиреЗ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕реБрдЭрд╛рд╡ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖред рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдкрд░реАрдХреНрд╖рдг рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

@DanielRosenwasser , рдЖрдкрдХреЗ рджреВрд╕рд░реЗ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрднреА рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЗрд╡рд▓ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рдРрд╕рд╛ рдХреБрдЫ рдХрд░реЗрдЧрд╛:

let something: /some-regex-with-backreferences/ = `
long enough string to make regex.test significantly affect performance
`

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

рддреАрд╕рд░рд╛ рд╕рд╡рд╛рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ regex рдЗрдВрдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП target рд╕реЗ tsconfig рдпрджрд┐ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдХреБрдЫ рдФрд░ рдЬрд╛рдВрдЪ рдХреА рдЬрд░реВрд░рдд рд╣реИред

@DanielRosenwasser рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рджреВрд╕рд░реЗ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЕрд╡рд▓реЛрдХрди рдХрд░рдирд╛ рдкрдбрд╝реЗ, рд╣реИ рдирд╛?

@Igmat рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред @rylphs рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ? рдпрд╣ рд╕рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдпрд╛рдкрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

type ColorLevel = (n:number) => n>0 && n<= 255
type RGB = {red:ColorLevel, green:ColorLevel, blue:ColorLevel};
let redColor:RGB = {red:255, green:0, blue:0}   //OK
let wrongColor:RGB = {red:255, green:900, blue:0} //wrong

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рдЖрджрд┐рдо рд╕реЗ рдкрд░реЗ рдЧреИрд░-рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред
рдПрдХ рдмрд┐рдВрджреБ, @DanielRosenwasser рдиреЗ рдЬреЛ рдореБрджреНрджрд╛ рдЙрдард╛рдпрд╛ - рд░реЗрдЧреЗрдХреНрд╕ рдЗрдВрдЬрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@zspitz рдпрд╣ рдЖрд╢рд╛рдЬрдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ TS рдХреЛ рдХреБрдЫ рдРрд╕реЗ рднрд╛рд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдХреБрдЫ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ рдЬреЛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВред

@Igmat

рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ? рд╢рд╛рдпрдж рд╕рддреНрдпрд╛рдкрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ "рд╕реБрд░рдХреНрд╖рд┐рдд"/рд╕рдВрдХрд▓рди-рд╕рдордп-рдЬреНрдЮрд╛рдд рд╕рдмрд╕реЗрдЯ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЛ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ

// type guard that introduces new nominal type int
function isInt(value: number): value is type int { return /^\d+$/.test(value.toString()); }
// -------------------------------------^^^^ add type keyword here
function printNum(value: number) { console.log(value); }
function printInt(value: int) { console.log(value); }
const num = 123;
printNum(num); // ok
printInt(num); // error
if (isInt(num)) {
    printNum(num); // ok
    printInt(num); // ok
}

@disjukr рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдЬреЛ рдЗрд╕рдХреА рдорд╛рдВрдЧ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ @disjukr рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рд╡реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рди рд╣реЛрдВред

рд╡рд┐рд╕реНрддрд╛рд░рд╢реАрд▓рддрд╛ рдЖрдИрдПрдордПрдЪрдУ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рд░рдЪрдирд╛рддреНрдордХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рдПрдХ рдордирдорд╛рдиреА рдкреНрд░рдХрд╛рд░ рдЧрд╛рд░реНрдб (рдлрд╝рдВрдХреНрд╢рди) рджреВрд╕рд░реЗ рдордирдорд╛рдиреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рдХрдерди рдорд╛рдирд╕рд┐рдХрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓реНрдкрд╡рд┐рдХрд╕рд┐рдд "рд╡рд┐рд╕реНрддрд╛рд░рд╢реАрд▓рддрд╛" рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ "рдмрд╣реБрдд рд░рдЪрдирд╛рддреНрдордХ" рд╣реИ - рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХ рд╕реНрдЯреЙрдк-рдЧреИрдк рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рд░рдЪрдирд╛рддреНрдордХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрддрд╛):

function isInt(value: number): value is type int { return /^\d+$/.test(value.toString()); }
// assert that biggerInt extends int. No compiler or runtime check that it actually does extend.
function isBiggerInt(value: number): value is type biggerInt extends int { return /^\d{6,}$/.test(value.toString()); }
// -----------------------------------------------------------^^^^ type extension assertion
function printNum(value: number) { console.log(value); }
function printInt(value: int) { console.log(value); }
function printBiggerInt(value: biggerInt) {console.log(value); }

const num = 123;
printNum(num); // ok
printInt(num); // error
printBiggerInt(num); // error
if (isInt(num)) {
    printNum(num); // ok
    printInt(num); // ok
    printBiggerInt(num); // error
}
if (isBiggerInt(num)) {
    printNum(num); // ok
    printInt(num); // ok
    printBiggerInt(num); // ok
}

рдЬреЛ рдзреНрд╡рдирд┐ рди рд╣реЛрдиреЗ рдкрд░ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛ рдерд╛, рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рд╣реЛ, рдпрд╛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ @disjukr рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? (рдпрджрд┐ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ @disjukr рдХреЗ рдЧреИрд░-рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВред)

рдСрдлрдЯреЙрдкрд┐рдХ рдХреА рддрд░рд╣,
рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдЕрд▓рдЧ рдХреА рдЧрдИ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ ^ рдФрд░ $ рдПрдВрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдЬрдм рдЖрдк рдХреБрдЫ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рдФрд░ рдПрдВрдХрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП regexp /^((dog|cat|fish)(,|$))+$/

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рджреЗрдВ /#[0-9]{6}/ рдФрд░ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдВ ${TColor} :

type TColor = 'red' | 'blue' | /#[0-9]{6}/;
type TBorderValue = /[0-9]+px (solid|dashed) ${TColor}/

рдирддреАрдЬрд╛:

let border1: TBorderValue = '1px solid red'; // OK
let border2: TBorderValue = '1px solid yellow'; // TSError: .....

рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ typestyle "рдЯрд╛рдЗрдк-рд╕реЗрдл" рд╕реАрдПрд╕рдПрд╕ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рдорджрдж рдХрд░реЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЪреЗрдХ рдХреЛрдб рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдорд╣рд╛рди рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рджреЗрдВрдЧреЗред

@DanielRosenwasser @alexanderbird @Igmat: IMO рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдЦреЗрд▓ рд╕реЗ рдмрджрд▓рддреА рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдФрд░ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдХреНрдпрд╛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ?

рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдмрд┐рд▓рд┐рдЯреА рдФрд░ рдЯрд╛рдЗрдк рдПрдорд┐рд╢рди рдмрд╛рдХреА рдлреАрдЪрд░ рдХреЗ рдЖрдбрд╝реЗ рдирд╣реАрдВ рдЖрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЙрди рдкрд╣рд▓реБрдУрдВ рдкрд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬрдм рд╡рд╣рд╛рдБ рд╣реЛред

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

@skbergam рдореИрдВ рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЯреАрдПрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдо рднреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓рдЧрднрдЧ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рд╣реИ (рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЗрд╕ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдмреА рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИ)ред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЯреАрдПрд╕ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рд╣реИ рддреЛ рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА ...

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рджреЛ рдЧреИрд░-рд╕рдорд╛рди рд░реЗрдЧреЗрдХреНрд╕ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЙрдк-рдкреНрд░рдХрд╛рд░/рдЕрд╕рд╛рдЗрдирдмрд┐рд▓рд┐рдЯреА рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдВрдЧреЗ

@RyanCavanaugh рдкрд╣рд▓реЗ @maiermic рдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрд╣реБрдкрдж рд╕рдордп рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ (рджреЗрдЦреЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд╡реЗрд╢рди рд╕рдорд╕реНрдпрд╛)ред

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд░реЗрдЧреЗрдХреНрд╕рдкреА рд░рд┐рд╢реНрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗред

рдЯрд╛рдЗрдк рдЪреЗрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЕрдЧрд░ рд╣рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕рдкреНрд╕ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ typeof рдПрдХ рдХреЙрдиреНрд╕реНрдЯ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ .d.ts рдлрд╛рдЗрд▓реЗрдВ), TS valueof e рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдореВрд▓реНрдп e iff e рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рддреНрд░реБрдЯрд┐ (рдФрд░ undefined рддрд░рд╣ рдХреБрдЫ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ)?

@maxlk рднреА рдСрдл-рдЯреЙрдкрд┐рдХ рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рд░реЗрдЧреЗрдХреНрд╕ рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдиреНрдпрдерд╛ рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдкрд░ рдЕрдиреБрдЧрд╛рдореА рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛: /^((dog|cat|fish)(,(?=\b)|$))+$/ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде https://regex101.com/r/AuyP3g/1 ред рдпрд╣ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж рдПрдХ рд╢рдмреНрдж рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рд╕рдХрд╛рд░рд╛рддреНрдордХ рд▓реБрдХрд╣реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реНрд╡ рдХреЛ рдПрдХ DRY рддрд░реАрдХреЗ рд╕реЗ рдкреБрди: рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рдирдорд╕реНрддреЗ!
рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ?
рдХреНрдпрд╛ рдЖрдк рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВрдЧреЗ? рд░реЛрдбрдореИрдк рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

@lgmat рдХреЗрд╡рд▓ lib.d.ts рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

рдХреНрдпрд╛ рд╡реЗ рднрдпрд╛рдирдХ рд╕реБрдзрд╛рд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ? рд╢рд╛рдпрдж рдЕрд▓реНрдлрд╛ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо?

рд░реЗрдЧреЗрдХреНрд╕ рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рдЗрдирдкреБрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

+1ред рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рдЖрдо рд╣реИ, рд╣рдореЗрдВ 'dd/mm/YYYY' рдЬреИрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджрд┐рдирд╛рдВрдХ рдкреНрд░рд╛рд░реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

  • рдЖрдЙрдЯрдкреБрдЯ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрдЯрд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╕рдВрдХрд▓рди рд╕рдордп рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ), рд╕рдВрд░рдЪрд┐рдд рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ
  • рд╡реНрдпрд╛рдХрд░рдг рд░реЗрдЧреЗрдХреНрд╕рдкреА рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдирд┐рдпрдорд┐рдд рд╣реИрдВ, рдЙрдирдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реВрдЪреА рд╣реИ, рдкреЗрдбрд╝ рдирд╣реАрдВ, рд╡реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд▓рдВрдмреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдХреЛ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдкрд╛рд░реНрд╕рд░ рдХреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдЬреЛ рд╕реАрдорд┐рдд рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ

рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдЖрдЙрдЯрд╕реЛрд░реНрд╕ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ # 21861 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдЗрд╕ рддрд░рд╣ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕реНрдЯреЗрдЯрд░ рд▓рд░реНрдирд┐рдВрдЧ рдХрд░реНрд╡ рдХреА рдХреАрдордд рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЗ! рдЗрд╕рдХреЗ рдКрдкрд░ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдЬрд╛рдВрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрднреА рднреА рдЦрдбрд╝рд╛ рд╣реЛ, рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдорд╢реАрдирд░реА рджреНрд╡рд╛рд░рд╛ рдЖ рд░рд╣рд╛ рд╣реЛ

рдЗрд╕рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рдХрд╕реНрдЯрдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рджрд╛рддрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреБрдЫ рднреА рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛: #21861

рдЙрджрд╛рд╣рд░рдг:

const uri: via URIParserAndEmitter = http://google.com; 
console.log(uri); // --> { protocol: 'http', host: 'google.com', path: undefined, query: undefined, hash: undefined }

const a: via PositiveNumberParser = 10; // --> 10
const b: via PositiveNumberParser = -10; // --> error

const date: via DateParser = 1/1/2019; // --> new Date(2019, 1, 1)


@lgmat рдХреЗрд╡рд▓ lib.d.ts рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ?

@zspitz рдЬреЛ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдирд╛рдЦреБрд╢ рдХрд░ рджреЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рджреЗрдЦреЗрдВрдЧреЗ, рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рдирд┐рд╖рд┐рджреНрдз рд╣реИред

рдХреНрдпрд╛ рд╡реЗ рднрдпрд╛рдирдХ рд╕реБрдзрд╛рд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ? рд╢рд╛рдпрдж рдЕрд▓реНрдлрд╛ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо?

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдЬрд░реВрд░рдд рд╣реИред @gtamas , @Andreweastwood

рд╕рд╛рде рд╣реА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #11152 рдЗрд╕рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдЧрд╛ред

@Igmat рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред @rylphs рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ? рдпрд╣ рд╕рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдпрд╛рдкрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

type ColorLevel = (n:number) => n>0 && n<= 255
type RGB = {red:ColorLevel, green:ColorLevel, blue:ColorLevel};
let redColor:RGB = {red:255, green:0, blue:0}   //OK
let wrongColor:RGB = {red:255, green:900, blue:0} //wrong

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рдЖрджрд┐рдо рд╕реЗ рдкрд░реЗ рдЧреИрд░-рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЬреЛ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ, рд╡рд╣ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрдмрдВрдзреА рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВ, рдХреБрдЫ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдореЗрдореЛрд░реА рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдвреЗрд░ рд╕рд╛рд░реА рд╕реИрдВрдбрдмреЙрдХреНрд╕рд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреАред рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рджреЗрдЦреВрдВрдЧрд╛, рдПрдХ рддрд╛рд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдПред

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

рдПрдХ рдмрд┐рдВрджреБ, @DanielRosenwasser рдиреЗ рдЬреЛ рдореБрджреНрджрд╛ рдЙрдард╛рдпрд╛ - рд░реЗрдЧреЗрдХреНрд╕ рдЗрдВрдЬрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрдВрдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИ, рдпрд╣ рдмреБрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ regExp рдХрд╛ рдХреМрди рд╕рд╛ "рдЖрдзреБрдирд┐рдХ" рднрд╛рдЧ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдЧрд╛ (рдХреНрдпрд╛ рдпрд╣ ES3 рд╣реИ?) regexp, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдирдП рдЭрдВрдбреЗ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рджрд╛рд╡реЗ рдХреЗ рдкреАрдЫреЗ рджреЗрдЦрдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдкред

const unicodeMatcher = /\u{1d306}/u;
let value: typeof unicodeMatcher;
function(input: string) {
  value = input;  // Invalid
  if (input.match(unicodeMatcher)) {
    value = input;  // OK
  }
}

рдпрджрд┐ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЙрдиреНрдирдд рдлрд╝реНрд▓реИрдЧ рд╡рд╛рд▓реЗ рдлрд╝реНрд▓реИрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджрд┐рдпрд╛ рд╣реИред

let value: typeof unicodeMatcher = 'ЁЭМЖ';  // Warning, string literal isn't checked, because `variable` is of type `/\u{1d306}/u`.

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдиреНрдирдд RegExp рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрджрд┐ рдЙрд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрдиреНрдирдд RegExp рдЬрд╛рдВрдЪ рдХреЛ рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рдмрддрд╛рддреЗ рд╣реБрдП рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЙрдиреНрдирдд рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рдзреНрд╡рдЬ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХрд╛ рдиреЛрдб рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

let value: typeof unicodeMatcher = 'ЁЭМЖ';  // OK

рдпрджрд┐ рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЙрдиреНрдирдд рдлрд╝реНрд▓реИрдЧ рдХреЗ рд╕рд╛рде рдлрд╝реНрд▓реИрдЧ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХрд╛ рдиреЛрдб рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

let value: typeof unicodeMatcher = 'ЁЭМЖ';  
// Error, NodeJS does not support advanced RegExp, upgrade NodeJS to version X.Y.Z, or disable advanced RegExp checking.

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

рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рджреЗрдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрддрдиреА рдмрдбрд╝реА рдХреНрд╖рдорддрд╛ рдФрд░ рджрд░реНрдЬрдиреЛрдВ рднрдпрд╛рдирдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ ...

AFAIK рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдорд┐рдЯ рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдЪреНрдЫрд╛ рдерд╛ рдЬреЛ рдХрд┐ рдПрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд┐рд╕ рдореБрджреНрджреЗ рдХреЛ рд╡рд╣ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЙрд╕реЗ рд░реЗрдЧреЗрдХреНрд╕ рдЕрдХреНрд╖рд░ (рдЬреЛ рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдЕрдХреНрд╖рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВ) рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдСрдкрд░реЗрдЯрд░ patternof ( typeof рд╕рдорд╛рди) рдХреЗ рдкрд░рд┐рдЪрдп рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ keyof ), рдЬреЛ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд▓реЗрдЧрд╛ рдФрд░ рдПрдХ _validated string_ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

type letterExpression = /[a-zA-Z]/;
let exp: letterExpression;
exp = /[a-zA-Z]/; // works
exp = /[A-Za-z]/; // error, the expressions do not match

type letter = patternof letterExpression;
type letter = patternof /[a-zA-Z]/; // this is equivalent

let a: letter;
a = 'f'; // works
a = '0'; // error
const email = /some-long-email-regex/;
type email = patternof typeof email;

declare let str: string;
if (str.match(email)) {
  str // typeof str === email
} else {
  str // typeof str === string
}

@ m93a рдореИрдВрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рдЬрдм рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдореБрдЭреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдХрд╛рд░рдг рдЙрддреНрд╕рд░реНрдЬрди рдкреНрд░рднрд╛рд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рджреЛрдиреЛрдВ рдирдП рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ) - рдЖрдИрдПрдордУ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрди рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╣реИ)ред

рдЗрд╕рдореЗрдВ 4 рдХрджрдо рд▓рдЧреЗрдВрдЧреЗ:

  1. regexp-validated string literal рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВ:
    TypeScript type Email = /some-long-email-regex/;
  2. рдЖрдЗрдП рдХреЛрд░ рд▓рд┐рдм рдореЗрдВ RegExp рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ рдореЗрдВ рдмрджрд▓реЗрдВ:
    TypeScript interface RegExp<T extends string = string> { test(stringToTest: string): stringToTest is T; }
  3. рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдмрджрд▓реЗрдВ:
    TypeScript const Email = /some-long-email-regex/; // infers to `RegExp</some-long-email-regex/>`
  4. conditional types рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдк рд╣реЗрд▓реНрдкрд░ рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕реЗ InstanceType :
    TypeScript type ValidatedStringType<T extends RegExp> = T extends RegExp<infer V> ? V : string;

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

const Email = /some-long-email-regex/;
type Email = ValidatedStringType<typeof Email>;

const email: Email = `[email protected]`; // correct
const email2: Email = `emexample.com`; // compile time error

let userInput: string;
if (Email.test(userInput)) {
    // `userInput` here IS of type `Email`
} else {
    // and here it is just `string`
}

@Igmat рдХреВрд▓ред рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдХрдо рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд▓рд╛рдн рдпрд╣ рдерд╛ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕ рдЕрдХреНрд╖рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдЕрдХреНрд╖рд░ рдХреЗ рд╕рдорд╛рди рд╣реА рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

let a: 'foo' = 'foo'; // works
let b: 42 = 42; // works
let c: /x/ = /x/; // error

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рд╕рд╛рджрдЧреА рдПрдХ рдиреБрдХрд╕рд╛рди рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ValidatedStringType<R> рдХреА рд▓рдВрдмрд╛рдИ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдордиреЗ рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо PatternOf<R> рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЗ рдЯрд╛рдЗрдк рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рд╕рд┐рд░реНрдл рдкрд╣рд▓реЗ рддреАрди рдЕрдХреНрд╖рд░ рдФрд░ рд╣рд┐рдЯ рдЯреИрдм рдЯрд╛рдЗрдк рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рд╕рд┐рд░реНрдл рдмрдбрд╝рд╛ рдХреЛрдб рд╕реНрдкреИрдЧреЗрдЯрд┐рдлрд┐рдХреЗрд╢рди рдкреНрд░рднрд╛рд╡ рд╣реИред

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

@Akxe рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реЛред

@RyanCavanaugh рдХреНрдпрд╛ рдЖрдк рд╣рдореЗрдВ рдЗрд╕ рдкрд░ рдЕрдкрдиреА рд░рд╛рдп рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЪрд╛рд░ рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ (рдЗрд╕реЗ рдЫреЛрдбрд╝рдХрд░) рдзрдиреНрдпрд╡рд╛рдж! :+1:

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреЛ .* рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ?

let a: 'foo' = 'foo'; // works
let b: 42 = 42; // works
let c: /x/ = /x/; // works
let d: string<x.> = 'xa'; // works

рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ 'foo' рдХреЛ string<foo> рд▓рд┐рдП рдЪреАрдиреА рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ValidatedStringType<R> рдХреА рд▓рдВрдмрд╛рдИ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдордиреЗ рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ _patterns_ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо PatternOf<R> рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@ m93a , IMO, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж InstanceType рдФрд░ ReturnType рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ PatternType<R> рдХрд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

@ рдЖрдорд┐рд░-рдЕрд░рдж, рджрд┐рд▓рдЪрд╕реНрдкред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ interface RegExp рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?

@RyanCavanaugh рдореИрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ред рдХреНрдпрд╛ рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@ amir-arad рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╛рдХреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╡рд┐рд░реЛрдз рдореЗрдВ рд╣реИред рдЕрдм рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдордирдорд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВред рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмреЗрд╣рдж рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдЬреИрд╕реЗ рд╡реЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЯреБрдХрдбрд╝реЗ рдЕрд░реНрде рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рджреЛрдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВ:

function foo(str: string) {
  return str === 'bar' ? true : false
}

type foo<T extends string> = T extends 'bar' ? true : false;

рдЖрдкрдХрд╛ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рдХреЛ let all = String(.*) рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдмрджрд╕реВрд░рдд рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

@ m93a рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рдЯрд╛рдЗрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдерд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

@Igmat рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ, рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:

interface RegExp {
    test(stringToTest: string): stringToTest is string<this>;
}

@ рдЖрдорд┐рд░-рдЕрд░рдж, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдкреВрд░реЗ рдЯреАрдПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ string рдмрд╣реБрдд рдмреБрдирд┐рдпрд╛рджреА рдЖрджрд┐рдо рд╣реИред

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

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдордп рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реВрдВ (рдпрд╣ рднреА, рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЯреАрдПрд╕ рдореЗрдВ рд╣рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрд┐рдирд╛ рдХрд┐рд╕реА рджреЗрд░реА рдХреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рддреЛ рдореИрдВ ' рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдкрдХреЛ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдпрджрд┐ рдпреЗ рд░реЗрдЧреЗрдХреНрд╕рдкреА-рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдереЗ (рдкрд░реНрд▓-рдЬреИрд╕реЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рдЬреЛ рдирд┐рдпрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ) рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрддрд╛рддреНрдордХ рдПрдлрдПрд╕рдПрдо рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдФрд░ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рдкрд░ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдЙрддреНрдкрд╛рдж рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреВрд▓рд┐рдпрди рдСрдкрд░реЗрд╢рдВрд╕ рдХреЗ рддрд╣рдд рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдмрдВрдж рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди-рд╕рдордп рд╡рд░реНрдг рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдП рдЧрдП рдереЗ, рддреЛ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рдХрд░реЗрдЧрд╛ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрдХ рдЧрд▓рддреА рдареАрдХ

рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдХрд┐ рдорд┐рдереНрд░рд┐рд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ JSX рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИред (рд╣рдо рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред)

  • рд╣рдорд╛рд░реЗ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЗ рд╣реБрдХ, oninit , oncreate , onbeforeupdate , onupdate , onbeforeremove , рдФрд░ onremove рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╣реИрдВ рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред
  • DOM vnode рдкрд░ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕рдЪрдореБрдЪ рдХреБрдЫ рдФрд░ рд╣реИрдВ рдЬреЛ on , рдФрд░ рд╣рдо рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ ( handleEvent рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде) рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, addEventListener рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ removeEventListener ред
  • рд╣рдо рдЙрдкрдпреБрдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рдмрд┐рдпреЛрдВ рдФрд░ рд░реЗрдлрд░реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред
  • рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдмреИрдХрд┐рдВрдЧ рдбреАрдУрдПрдо рдиреЛрдб рдкрд░ рдЙрдирдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рддреЛ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ + рдкреНрд░рдХрд╛рд░ рдирд┐рд╖реЗрдз рдХреЗ рд╕рд╛рде , рд╣рдо DOM vnodes рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

interface BaseAttributes {
    // Lifecycle attributes
    oninit(vnode: Vnode<this, Vnode<Attributes, []>>): void;
    oncreate(vnode: Vnode<this, Vnode<Attributes, []>>): void;
    onbeforeupdate(
        vnode: Vnode<this, Vnode<Attributes, []>>,
        old: Vnode<this, Vnode<Attributes, []>>
    ): void;
    onupdate(vnode: Vnode<this, Vnode<Attributes, []>>): void;
    onbeforeremove(vnode: Vnode<this, Vnode<Attributes, []>>): void | Promise<void>;
    onremove(vnode: Vnode<this, Vnode<Attributes, []>>): void;

    // Control attributes
    key: PropertyKey;
}

interface DOMAttributes extends BaseAttributes {
    // Event handlers
    [key: /^on/ & not keyof BaseAttributes]: (
        ((this: Element, ev: Event) => void | boolean) |
        {handleEvent(ev: Event): void}
    );

    // Other attributes
    [key: keyof HTMLElement & not keyof BaseAttributes & not /^on/]: any;
    [key: string & not keyof BaseAttributes & not /^on/]: string;
}

interface ComponentAttributes extends BaseAttributes {
    // Nothing else interesting unless components define them.
}

(рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реЗрдЧреЗрдХреНрд╕ рд╕реЗ рд╕рдореВрд╣ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд╕ рдкрд░ рдЕрдкрдиреА рд╕рд╛рдВрд╕ рдирд╣реАрдВ рд░реЛрдХреВрдВрдЧрд╛ред)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рд╕реНрдкрд╖реНрдЯ
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рдмрд┐рдЯ рдХреЛ рд╕рд╣реА рдХрд░реЗрдВред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 3: рд╕рд┐рдВрдЧрд▓-рдХреИрд░реЗрдХреНрдЯрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рдиреАрдд рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ

рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ред

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

  • `value` - рдпрд╣ рд╕рдЪрдореБрдЪ "value" рдмрд░рд╛рдмрд░ рд╣реИ
  • `value${"a" | "b"}` - рдпрд╣ рд╕рдЪрдореБрдЪ "valuea" | "valueb" рдмрд░рд╛рдмрд░ рд╣реИ
  • `value${string}` - рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ regexp /^value/ , рд▓реЗрдХрд┐рди "value" , "valuea" , рдФрд░ "valueakjsfbf aflksfief fskdf d" рд╕рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
  • `foo${string}bar` - рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ regexp /^foo.*bar$/ , рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИред
  • рдмреЗрд╢рдХ, рдХрдИ рдкреНрд░рдХреНрд╖реЗрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред `foo${string}bar${string}baz` рдПрдХ рд╡реИрдз рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реИред
  • рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ string рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП , рдФрд░ рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЪрд╛рд╣рд┐рдП ред (рджреВрд╕рд░реА рд╢рд░реНрдд рддрдХрдиреАрдХреА рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реИред)
  • рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ A рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ B рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм A рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рд╕реЗрдЯ B рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡рд┐рд╢реЗрд╖ starof T рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ T рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд┐рдВрдЧрд▓-рдХреИрд░реЗрдХреНрдЯрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред string starof (...) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ ... U+0000 рд╕реЗ U+FFFF рддрдХ рд╕рднреА рдПрдХрд▓ UCS-2 рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХрд╛ рд╕рдВрдШ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдХреЗрд▓рд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐рд░рд╛рдП рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдкрдХреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ES рдмреЗрд╕ -10 рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ:

type DecimalDigit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
type Decimal = `${DecimalDigit}{starof DecimalDigit}`

type Numeric = `${(
    | Decimal
    | `${Decimal}.${starof DecimalDigit}`
    | `.${Decimal}`
)}${"" | (
    | `E${Decimal}` | `E+${Decimal}` | `E-${Decimal}`
    | `e${Decimal}` | `e+${Decimal}` | `e-${Decimal}`
)}`

рдФрд░ рдЗрд╕реА рддрд░рд╣, рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • Number.prototype.toString(base?) - рдпрд╣ рдЙрдкрд░реЛрдХреНрдд Numeric рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЗрд╕рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд base s рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • +x , x | 0 , parseInt(x) , рдФрд░ рдЗрд╕реА рддрд░рд╣ - рдЬрдм x рдХреЛ Numeric рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╢рд╛рдмреНрджрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ: Key extends `on${infer EventName}` ? EventTypeMap[TagName][EventName] : never ред рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдкреВрд░реНрдг рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рд╕рдорд╛рд╡реЗрд╢рди рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ${string} рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЧреИрд░ рд▓рд╛рд▓рдЪреА рд╣реИ, рдЗрд╕рд▓рд┐рдП ` "foo.bar.baz" extends ${infer T}.${infer U} ? [T, U] : never рд░рд┐рдЯрд░реНрди ["foo", "bar.baz"] , рди рдХрд┐ ["foo.bar", "baz"] ред


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

  • рдЦрд╛рд▓реА рднрд╛рд╖рд╛: ""
  • рд╕рдВрдШ: "a" | "b"
  • рд╕рдВрдпреЛрдЬрди: `${a}${b}`
  • рдХреНрд▓реЗрди рд╕реНрдЯрд╛рд░ (рдЖрдВрд╢рд┐рдХ): starof T ( T рдХреЗрд╡рд▓ рдПрдХрд▓ рд╡рд░реНрдг рдФрд░ рд╕рдВрдШ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред)

рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд╕рдмрдЧреНрд░рд╛рдл рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреБрдЫ рдмрдбрд╝реЗ рд░рд┐рдбреАрдорд┐рдВрдЧ рдХрд╛рд░рдХ рд╣реИрдВ:

  1. рдЕрдм рддрдХ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдЫреЛрдЯреЗ рдкрд░рд┐рдорд┐рдд рддрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдШ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред (рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд░рд╕реНрд╕рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдорд┐рд▓рд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЧрд▓-рдХреИрд░реЗрдХреНрдЯрд░ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдкреНрд▓рд┐рдЯ + рдЬреЙрдЗрди рдореЗрдВ рд╕рдорд╛рди рд╣реИред)

  2. рдЖрдк рд╕рдВрдкреВрд░реНрдг рдПрдХреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ:

    1. рдРрд╕реЗ рд╡рд░реНрдгреЛрдВ рдХреЗ рддрд╛рд░рд╛рдВрдХрд┐рдд рд╕рдВрдШ рд╕рдмрдЧреНрд░рд╛рдл рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреИрд░реЗрдВрдЯ рдиреЛрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдФрд░ рд╕рдмрдЧреНрд░рд╛рдл рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдбреНрд╕ рджреЛрдиреЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рд╡рд░реНрдгреЛрдВ рдФрд░ рд╕рдмрдЧреНрд░рд╛рдл рдХреЗ рд╕рднреА рдЪрд╛рдЗрд▓реНрдб рдиреЛрдбреНрд╕ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╣реЛрддреЗ рд╣реИрдВред
    2. рдмрд╛рдХреА рдЧреНрд░рд╛рдл рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдкреЗрдбрд╝ рдЬреИрд╕реА рд╕рдВрд░рдЪрдирд╛ рд╣реИред

    рдЗрд╕ Math.SE рдЪреИрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ (рд▓рдЧрднрдЧ рдпрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рдерд╛ ), рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдгрд╛рдореА рдЧреНрд░рд╛рдл рдореЗрдВ рдПрдХ рдмрд╛рдзреНрдп рдЬреАрдирд╕ (рдпрд╛рдиреА рдЕрдиреНрдп рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдХреВрджрдиреЗ рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде) рджреЛрдиреЛрдВ рд╣реЛрдВрдЧреЗ рдФрд░, рдХреЛрдИ starof рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ рдЯрд╛рдЗрдк рд╕рдорд╛рдирддрд╛ рдПрдХ рдмрд╣реБрдкрдж-рд╕рдордп рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрддреА рд╣реИ рдФрд░ рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рднреА рдмрд╣реБрдд рдзреАрдорд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреЗрдбрд╝ рд╕рдорд╛рдирддрд╛ рд╕реЗ рдХреБрдЫ рд╣рдж рддрдХ рддреЗрдЬрд╝ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рдкреВрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдкрд░ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдВрджреЗрд╣ рд╣реИ (рд╕рдмрдЧреНрд░рд╛рдл рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдмрд╕реЗрдЯ) рдЙрдЪрд┐рдд рдЧреБрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдмрд╣реБрдкрдж-рд╕рдордп рднреА рд╣реИред (рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рдореЗрдВ "рдПрд▓реНрдЧреЛрд░рд┐рджрдо" рдФрд░ рд╕рдВрджрд░реНрдн рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред)


  3. рдЗрди рдЪрд╛рдмрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмрдбрд╝реА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЧрдд рдХреЛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдкрд░рд┐рд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рдпрд╣ рдЫреЛрдЯреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝ рд╣реИ, рдпрд╣ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред


  4. рддреБрд▓рдирд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рдмрдЧреНрд░рд╛рдл рдХрдо рд╕реЗ рдХрдо рдПрдХ рдиреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ: рд░реВрдЯ рдиреЛрдбред (рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред) рддреЛ рдпрд╣ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рди рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХрдо рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдмрд╣реБрдкрдж рд╕рдордп рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдЧрд╛ред


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

* рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ, рдЬреАрдирд╕ рдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЙрд▓реНрдЯрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЫрд▓рд╛рдВрдЧ рдХреЗ рдЧреНрд░рд╛рдлрд╝ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рддрд╣ рдкрд░ рдЫреЗрдж рдХрд░рдиреЗ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛), рд▓реЗрдХрд┐рди рдПрдХ рд╕реАрдорд┐рдд рдЬреАрдирд╕ (рдЫрд┐рджреНрд░реЛрдВ рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛) рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреВрдж рд╕реЗ рд╣реИ .

рдЗрд╕ рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдиреБрд╡рд╛рдж

// This would work as a *full* type implementation mod implementations of `HTMLTypeMap` +
// `HTMLEventMap`
type BaseAttributes = {
    // Lifecycle attributes
    oninit(vnode: Vnode<this, Vnode<Attributes, []>>): void;
    oncreate(vnode: Vnode<this, Vnode<Attributes, []>>): void;
    onbeforeupdate(
        vnode: Vnode<this, Vnode<Attributes, []>>,
        old: Vnode<this, Vnode<Attributes, []>>
    ): void;
    onupdate(vnode: Vnode<this, Vnode<Attributes, []>>): void;
    onbeforeremove(vnode: Vnode<this, Vnode<Attributes, []>>): void | Promise<void>;
    onremove(vnode: Vnode<this, Vnode<Attributes, []>>): void;

    // Control attributes
    key: PropertyKey;
}

interface HTMLTypeMap {
    // ...
}

interface HTMLEventMap {
    // ...
}

// Just asserting a simple constraint
type _Assert<T extends true> = never;
type _Test0 = _Assert<
    keyof HTMLTypeMap[keyof HTMLTypeMap] extends `on${string}` ? false : true
>;

type EventHandler<Event> =
    ((this: Element, ev: Event) => void | boolean) |
    {handleEvent(ev: Event): void};

type Optional<T> = {[P in keyof T]?: T[P] | null | undefined | void}

type DOMAttributes<T extends keyof HTMLAttributeMap> = Optional<(
    & BaseAttributes
    & {[K in `on${keyof HTMLEventMap[T]}` & not keyof BaseAttributes]: EventHandler<(
        K extends `on${infer E}` ? HTMLEventMap[E] : never
    )>}
    & Record<
        keyof `on${string & not keyof HTMLEventMap}` & not keyof BaseAttributes,
        EventHandler<Event>
    >
    & Pick<HTMLTypeMap[T], (
        & keyof HTMLTypeMap[T]
        & not `on${string}`
        & not keyof BaseAttributes
    )>
    & Record<(
        & string
        & not keyof HTMLTypeMap[T]
        & not keyof BaseAttributes
        & not `on${string}`
    ), string | boolean>
)>;

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рд▓реЙрдбрд╢ рдХреА _.get рд╡рд┐рдзрд┐ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЗрд╕рдХреА рд╕рдВрдкрддреНрддрд┐ рд╢реЙрд░реНрдЯрд╣реИрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдЗрд╕рдХреА _.property(path) рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреА _.map(coll, path) рд╢реЙрд░реНрдЯрд╣реИрдВрдбред рд╢рд╛рдпрдж рдХрдИ рдЕрдиреНрдп рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рднреА рдирд╣реАрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред (рдореИрдВ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд╕рдВрдпреЛрдЬрди рдФрд░ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЪрд╛рд▓ рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдЕрдиреБрдХреНрд░рдорд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ, {0: ..., 1: ...}[Path extends "" ? 0 : 1] рдЬреИрд╕рд╛ рдХреБрдЫ

рдореЗрд░реА рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╣реИ рдХрд┐ рд╣рдо рдЯрд╛рдЗрдк рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рджрд╛рддрд╛ рдХреНрдпреЛрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ? рдЪреВрдВрдХрд┐

  1. рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрдИ рдирдИ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╡реНрдпрд╛рдкрдХ рд╕рдореВрд╣ рд╕реЗ рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд░реЗрдЧреЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдореВрд▓реНрдп рджреЗрдЦрддреЗ рд╣реИрдВред
  2. рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░реЗрдкреЛ рдорд╛рд▓рд┐рдХ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВ, рдФрд░ рд╕рд╣реА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреЗрдЦреЗрдВ #рейрезрейрем

рдПрдл # рдореЗрдВ рдУрдкрди рд╕реЛрд░реНрд╕ рд░реЗрдЧреЗрдХреНрд╕ рдЯрд╛рдЗрдк рдкреНрд░рджрд╛рддрд╛ рд╣реИред

рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА: https://link.medium.com/0wS7vgaDQV

рдХреЛрдИ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЯрд╛рдЗрдк рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдФрд░ рд░реЗрдЧреЗрдХреНрд╕ рдЯрд╛рдЗрдк рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреЛ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЗрд╕ рддрд░рд╣ рдХрд░реЗрдЧрд╛:

type PhoneNumber = RegexProvider</^\d{3}-\d{3}-\d{4}$/>
const acceptableNumber: PhoneNumber = "123-456-7890"; //  no compiler error
const unacceptableNumber: PhoneNumber = "hello world"; // compiler error

@AlexLeung рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрд╛рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

  • рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рднрд╛рд╡рдирд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рджрд╛рддрд╛ рдПрдХ рдирд╛рдордорд╛рддреНрд░ рдХрд╛ string рдЙрдкрдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВрдЧреЗ рдЬрд╣рд╛рдВ RegexProvider</^foo$/> рдХреЛ "foo" рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдорд╛рдореВрд▓реА рдЙрдкрдкреНрд░рдХрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, RegexProvider</^foo$/> рдФрд░ RegexProvider</^fo{2}$/> рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реАрдзреЗ рдЙрдирдХреЗ рдореВрд▓ рдореЗрдВ рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред
  • рдореЗрд░реЗ рд╕рд╛рде, рдЖрдк рди рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ Key extends `on${infer K}` ? K : never рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ Key extends `${Prefix}${infer Rest}` ? Rest : never рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЯрд╛рдЗрдк рдкреНрд░рджрд╛рддрд╛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рддреЛ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред
  • рдореЗрд░рд╛ рд╡реИрдЪрд╛рд░рд┐рдХ рд╕реНрддрд░ рдкрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдореИрдВ рд╕рд┐рд░реНрдл рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдпреЛрдЬрди рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░, рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЖрд░рдПрдЪрдПрд╕ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдореИрдВ рдпрд╣ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ regexp /.*/ рдХреА рдЬрдЧрд╣ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП string рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреЛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рднрд╛рдЧреЛрдВ рд╕реЗ рдЕрд▓рдЧ, рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рджреВрд╕рд░реЗ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдпрджрд┐ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ , рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

BTW, рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрднреА рднреА рдЙрд╕ PhoneNumber рдЙрджрд╛рд╣рд░рдг рдХреЛ рднреА рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдбреЗрдЯрд╛ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреАрдПрд╕ рднреВрдорд┐ рдореЗрдВ рд╣реИ, рди рдХрд┐ рдбреЗрдЯрд╛ рдЬреЛ рдХрд╣реАрдВ рдФрд░ рдореМрдЬреВрдж рд╣реИ (рдПрдл # рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рддрд╛ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ)ред (рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд╕рдВрднрд╛рд╡рд┐рдд рдлреЛрди рдирдВрдмрд░реЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред)

type D = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
type PhoneNumber = `${D}${D}${D}-${D}${D}${D}-${D}${D}${D}${D}`;

RegexProvider^foo$/> рдФрд░ RegexProvider^fo{2}$/> рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛

рдЯрд╛рдЗрдк рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдХреБрдЫ equals рдпрд╛ compare рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддрд╛рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рддрд╛ рд▓реЗрдЦрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рджреЛрдиреЛрдВ рдорд╛рдорд▓реЗ рд╕рдордХрдХреНрд╖ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЯрд╛рдЗрдк рдкреНрд░рджрд╛рддрд╛ рд▓реЗрдЦрдХ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдпрд╛ рдирд╛рдордорд╛рддреНрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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

type D = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
type PhoneNumber = StringTemplateMatcherProvider<D, D, D, "-", D, D, D, "-", D, D, D, D>;

@AlexLeung рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП "123-456-7890" рдкреНрд░рдХрд╛рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ? (рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рдЪреЗрдХрд░ рдХреЛ рдмрд╣реБрдд рдзреАрдорд╛ рдХрд░ рджреЗрдЧрд╛ред)

рдЕрд░реНрдз-рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░реНрдЪрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рдХрд╛ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ рдлрд╝реЛрди рдирдВрдмрд░)? рдПрдХ рд╕реНрдерд┐рддрд┐ рдЬрд╣рд╛рдВ рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд╡рд╣ рд╣реИ thread_{number} рдкреНрд░рд╛рд░реВрдк рдХреЗ рдХрдорд░реЗ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдирд╛ред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд░реЗрдЧреЗрдХреНрд╕ thread_[1-9]\d* ред рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╛рд░реВрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рд╕рдВрднрд╡ (рдпрд╛ рд╕рдВрднрд╡ рднреА) рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорд╛рди рдХрд╛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рднрд╛рдЧ _any_ рд▓рдВрдмрд╛рдИ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@jhpratt рдореИрдВрдиреЗ starof ("0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9") /^\d*$/ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдпрд╣ рдЙрд╕реА рддрд░рд╣ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ string /^[\u0000-\uFFFF]*$/ рд░реВрдк рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдореИрдВ рдЗрд╕рд╕реЗ рдЖрдЧреЗ starof рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рдЬреИрд╕реЗ рдХрд┐ рдордирдорд╛рдиреА рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛, рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг: рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рджреЛ рдордирдорд╛рдиреА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ * рд╕рдордХрдХреНрд╖ рд╣реИрдВ рдмрд╣реБрдкрдж рд╕реНрдерд╛рди рдпрд╛ рдмрд╣реБрдкрдж рд╕рдордп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( рджреЛрдиреЛрдВ рдХреЛ рдиреНрдпреВрдирддрдо рдбреАрдПрдлрдП рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ рдФрд░ рддреБрд▓рдирд╛ рдХрд░реЗрдВ - рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛, рд▓реЗрдХрд┐рди рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛), рд▓реЗрдХрд┐рди рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рджреЛрдиреЛрдВ рддрд░реАрдХреЗ рдмрд╣реБрдд рдзреАрдореЗ рд╣реИрдВ рдФрд░ AFAICT рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрдХреНрд╡рд╛рдпрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ (рдЬреИрд╕реЗ a{2} ), рдФрд░ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдореНрдп (рдШрд╛рддреАрдп рдЬрдЯрд┐рд▓рддрд╛) рд╣реИ ред рдпрд╣ рдХреЗрд╡рд▓ рддреБрд▓реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕рдкреА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рдмрд╕реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдПрдХ рдФрд░ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдореИрдЪ, рдЬреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рднреА рдЬрдЯрд┐рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

* рдЧрдгрд┐рдд рдХреЗ рдЕрд░реНрде рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐: рдореИрдВ рдХреЗрд╡рд▓ рдПрдХрд▓ рд╡рд░реНрдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, () , (ab) , (a|b) , рдФрд░ (a*) , рдЬрд╣рд╛рдВ a рдФрд░ b рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рднрд┐рдиреНрди) рд╣реИрдВред

рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдЧреВрдВрдЧрд╛ рд╕рд╡рд╛рд▓ рд╣реИ, рд▓реЗрдХрд┐рди ... рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп (рдпрд╛ рддреЛ рд▓реИрдореНрдмреНрдбрд╛ рдпрд╛ рдирд╛рдорд┐рдд) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реАрдорд┐рдд рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдХрд╛рдлреА рдЖрд╕рд╛рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо ":" рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдХреЛрдИ рд░рд╛рдп рд░рдЦрддреЗ рд╣реИрдВ рддреЛ ":" рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ):

type email = string : (s) => { return !!s.match(...) }
type phone_number = string : (n) => { return !!String(n).match(...) }
type excel_worksheet_name = string : (s) => { return (s != "History") && s.length <= 31 && ... }

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ, рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдХреЗрд╡рд▓ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ:

  • рдПрдХ рдПрдХрд▓ рддрд░реНрдХ рд╣реИ, рдЬрд┐рд╕реЗ "рдЖрдзрд╛рд░" рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ/рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдЪрд░ рдЬреЛ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ
  • рдПрдХ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░реЗрдВ (рдЬрд┐рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмреВрд▓ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджрд╛рдпрд░реЗ рдХреЛ рдПрдХ рдкреНрд░рдмрдВрдзрдиреАрдп рдЖрдХрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдирд╛:

  • рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛) рдХреЗ рд╕рдмрд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдмрдВрдз рдЗрддрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣реЛрдЧрд╛, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рдкрд░ рдмрд╣рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдзрд╛рди рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдЙрдкрд░реЛрдХреНрдд рд╕реАрдорд╛рдУрдВ рдХрд╛ рдереЛрдбрд╝рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЖрд░рд╛рдо рджреЗрдирд╛ рдПрдХ рд╕рд░рд▓ рдФрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдХреА рдЪреМрдбрд╝рд╛рдИ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛ред

@mewalig рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ (рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд░рдирдЯрд╛рдЗрдо (рдЪрд░, рдлрд╝рдВрдХреНрд╢рдВрд╕)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЧрдП рдХреБрдЫ рднреА рдЪрд▓рд╛рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреБрд░реА рддрд░рд╣ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг while(true){} ред рдпрджрд┐ рдЖрдк рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрд╕ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ "PHP рддрд░реАрдХрд╛" рд╣реЛрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ

let runtime: types = runtime;

(рдЕрд░реНрдерд╛рдд рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░) рдЕрдВрджрд░ рд╕реЗ рдмрд╛рд╣рд░, рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ

type types = types: runtime;

рдЬреЛ рднрдпрд╛рдирдХ рд╣реИред рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд░рдирдЯрд╛рдЗрдо (рдЪрд░, рдлрд╝рдВрдХреНрд╢рдВрд╕)

рдмреЗрд╢рдХ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЕрдЧрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд╛рд╕ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдирдЯрд╛рдЗрдо рдЙрдкрд▓рдмреНрдз рд╣реИ ( tsc рдХрд░рддрд╛ рд╣реИ, рдмреАрдЯреАрдбрдмреНрд▓реВ!)ред рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ fetch() рдмрдирд╛рдо рд░рдирдЯрд╛рдЗрдо рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдХреЗ рд╕рдВрдХрд▓рди-рд╕рдордп рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдмрд╕ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ "PHP рддрд░реАрдХрд╛" рд╣реЛрдЧрд╛ред

рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ C++ constexpr functions рдХреЗ рд╕рдорд╛рди рд╣реИ , рдЬреЛ рдареАрдХ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ constexpr рдХреЗрд╡рд▓ constexpr рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ constexpr рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддрдм рдЖрдкрдХреЗ рдкрд╛рд╕ constexpr -рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдорддреБрд▓реНрдп рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рднреА рдореЗрд░реЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ: рдПрд▓рдПрдЪрдПрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрд░рдПрдЪрдПрд╕ рднреА рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдЖрдк "рдЖрдзрд╛рд░" рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд░рдЪрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рднреА рд╣рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рддреЛ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рднрдЯрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рдорд╛рди рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдЕрднреА рд░реБрдХрддреА рджрд┐рдЦ рд░рд╣реА рд╣реИ ( рдкреАрдЖрд░ рдмрдВрдж рд╣реИ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдиреЛрдЯреНрд╕ рдЯреАрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ _рдЗрд╕ рдкрд░ рддрдм рддрдХ рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рди рд╣реЛрдВ, рдФрд░ рд╣рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВред_)ред

рд╡реИрд╕реЗ рднреА, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдкреАрдЖрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд░реЗрдЧреЗрдХреНрд╕ рдкреИрдЯрд░реНрди рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ ( @isiahmeadows рдиреЗ рдЕрдкрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдм рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдкрдирд╛ рд╕рд┐рд░ рд▓рдкреЗрдЯ рдирд╣реАрдВ рд╕рдХрддрд╛ ...)

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкреАрдЖрд░ рдкрд╕рдВрдж рд╣реИ рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЙрд╕реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ (рдФрд░ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░ infer рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде)ред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рдЖрдк рдкрд╛рд░рд┐рдд рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ "рдирд┐рдХрд╛рд▓реЗрдВ" рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╣реИред

type Prop1 = /(\w)\.(\w)/

рдФрд░ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

const goodLiteral = "foo.bar";
const badLiteral = "foo";
const regextTest: Prop1 = goodLiteral; //no error
const regextTest: Prop1 = badLiteral; //compiler error

function funProp1(prop: Prop1) { } 

funProp1(goodLiteral); //no error
funProp1(badLiteral); //error

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдХреЛрдг рдмреНрд░реИрдХреЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдорд┐рд▓рд╛рди рдХрд┐рдП рдЧрдП рддрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

type Prop1 = /(\w)\.(\w)/
const Prop1 = /(\w)\.(\w)/

const goodLiteral = "foo.bar";
const badLiteral = "foo";

function funProp1<M1 extends string, M2 extends string>(prop: Prop1<M1, M2>) : [M1, M2] 
{
    const m = prop.match(Prop1);
    return [m[1], m[2]];
} 

const res1 = funProp1(goodLiteral); //no error. Function signature inferred to be funProp<"foo", "bar">(prop: Prop1<"foo", "bar">) : ["foo", "bar"]
const res2 = funProp1(badLiteral); //compiler error

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ res1 рдХрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдкреНрд░рдХрд╛рд░ ["foo", "bar"]

рдХреНрдпрд╛ рдпрд╣ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рд╣реИ?

  1. Ember.js/lodash рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдЖрдк рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд "рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрде" рдЧреЗрдЯрдЯрд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░реЗ:

const deep = get(objNested, "nested.very.deep")

рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╕рдВрднрд╡ рдХреЗ рддрдп рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рднрд╛рд░ рдХреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ get рдХреЗ "рдЧрд╣рд░рд╛рдИ"ред

  1. рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ https://github.com/Microsoft/TypeScript/issues/12754ред рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд▓рдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рд╕реЗ рдХреБрдЫ рдЙрдкрд╕рд░реНрдЧ/рдкреНрд░рддреНрдпрдп рдХреЛ рд╣рдЯрд╛ рджреЗрдВ)ред рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдирдИ рдХреБрдВрдЬреА рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╢рд╛рдпрдж рдореИрдк рдХрд┐рдП рдЧрдП рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдХреБрдЫ рдФрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП { [ StripAsyncSuffix<P> for P in K ] : T[P] } рдЬреИрд╕реЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕рд╛ рдХреБрдЫ

рд╢рд╛рдпрдж рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рднреА рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЗрди рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗ (1. рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛, 2. рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдкрддреНрддрд┐ рдирд╛рдореЛрдВ рдХреЛ рдирдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирдП рд╕рдВрдкрддреНрддрд┐ рдирд╛рдореЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛)

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд▓рд┐рдВрдЯ рдирд┐рдпрдо рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ - рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрд░рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЖрдИрдбреА рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдкреНрд░реЙрдкреНрд╕ рдХреА рд╡реИрдзрддрд╛ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛

рдХреНрдпрд╛ рдЯрд╛рдЗрдк рдкреНрд░реЛрд╡рд╛рдЗрдбрд░, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд┐рдЯрд░рд▓ рдпрд╛ рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдХреЛрдИ рд╣рд▓рдЪрд▓ рд╣реИ? рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рд░реНрдХрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

interface TickerSymbol extends String {}

рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ string рдкрд░ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

interface TickerSymbol extends String {}
var symbol: TickerSymbol = 'MSFT';
// declare var tickers: {[symbol: TickerSymbol]: any}; // Error: index key must be string or number
declare var tickers: {[symbol: string]: any};
// tickers[symbol]; // Type 'TickerSymbol' cannot be used as an index type
tickers[symbol as string]; // OK

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ String (рдкреВрдВрдЬреА S рдХреЗ рд╕рд╛рде) рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

var obj = { one: 1 }
var key = new String('one');
obj[key]; // TypeScript Error: Type 'String' cannot be used as an index type.
// but JS gives expected output:
// 1

@DanielRosenwasser рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ , рдФрд░ 2016 рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ , рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рд╣рдордиреЗ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рд╣реИ рдФрд░ рдХреБрдЫ рдкреНрд░рд╢реНрди рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред

рдЕрдм рддрдХ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкрд╣рд▓реВ

рдЙрддреНрд╕рд░реНрдЬрди рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдХрд╛рд░

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

https://github.com/microsoft/TypeScript/issues/6579#issuecomment -220180091 - рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ

type Integer(n:number) => String(n).macth(/^[0-9]+$/)

https://github.com/microsoft/TypeScript/issues/6579#issuecomment -261519733 - рдпрд╣ рднреА рдХрд░рддрд╛ рд╣реИ

type CssColor = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
// ... later
setFontColorFromString(color: string) {
    fontColor = color;// compile time error
    if (CssColor.test(color)) {
    //  ^^^^^^^^ no value declaration of 'CssColor' !
        fontColor = color;// correct
    }
}

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдБ: рдпрд╣ рдПрдХ рдиреЙрди-рд╕реНрдЯрд╛рд░реНрдЯрд░ рд╣реИ ред рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░ composable рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреЗ рдПрд╕ рдЙрддреНрд╕рд░реНрдЬрдХ рдЗрд╕ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ

type Matcher<T extends number | boolean> = T extends number ? /\d+/ : /true|false/;
function fn<T extends number | boolean(arg: T, s: Matcher<T>) {
  type R = Matcher<T>
  if (R.test(arg)) {
      // ...
  }
}
fn(10, "10");
fn(false, "false");

рдЪреМрд░рд╛рд╣реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдФрд░ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЙрдирдХреЗ рд╕рдВрдШреЛрдВ рдФрд░ рдЪреМрд░рд╛рд╣реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВред

type Regex_1 = / ... /;
type Regex_2 = / ... /;
type NonRegex = { ... };
type test_4 = Regex_1 & NonRegex;// compile time error

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

рд╢реНрд░рдорджрдХреНрд╖рддрд╛ рд╢рд╛рд╕реНрддреНрд░

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд╣рдорд╛рд░рд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рд╣реА RegExp рдХреЛ рджреЛ рдмрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ (рдПрдХ рдмрд╛рд░ рд╡реИрд▓реНрдпреВ рд╕реНрдкреЗрд╕ рдореЗрдВ, рдПрдХ рдмрд╛рд░ рдЯрд╛рдЗрдк рд╕реНрдкреЗрд╕ рдореЗрдВ)ред

рдЙрддреНрд╕рд░реНрдЬрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕рдмрд╕реЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдореВрд▓реНрдп рд╕реНрдерд╛рди рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ:

// Probably put this in lib.d.ts
type PatternOf<T extends RegExp> = T extends { test(s: unknown): s is infer P } ? P : never;

const ZipCode = /^\d\d\d\d\d$/;
function map(z: PatternOf<typeof ZipCode>) {
}

map('98052'); // OK
map('Redmond'); // Error

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

function map(z: /^\d\d\d\d\d$/) { }
map('98052'); // OK
map('Redmond'); // Error

function fn(s: string) {
    map(s); // Error
    // typo
    if (/^\d\d\d\d$/.test(s)) {
        // Error, /^\d\d\d\d$/ is not assignable to /^\d\d\d\d\d$/
        map(s);
    }

    if (/^\d\d\d\d\d$/.test(s)) {
        // OK
        map(s);
    }
}

рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг

рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ:

  • рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ (рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕рд╣рд┐рдд рдЬреЛ рдЕрднреА рддрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ)
  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рд╛рд░реНрдердХ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ
  • рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ

рд╕рд╛рд╣рд┐рддреНрдп рдХрд╛ рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рддреНрдпрд╛рдкрди

рдпрд╣ рдзрд╛рдЧрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ; рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдЕрдзрд┐рдХ рджреБрд░реНрд▓рдн рд░рд╣реЗ рд╣реИрдВред рдкрд░реЗрд╢рд╛рдиреА рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реНрдг рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ - рд╡реЗ рдПрдХ RegExp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред

  • рдлрд╝реЙрдиреНрдЯ рд░рдВрдЧ - AFAIK рдХреБрдЫ рднреА рдЬреЛ рд╣реЗрдХреНрд╕ рд░рдВрдЧреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ "рд╕рдлреЗрдж" рдпрд╛ "рд╕реНрдХрд╛рдИрдмреНрд▓реВ"ред рдпрд╣ rgb(255, 0, 0) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рднреА рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
  • рдПрд╕рдПрд╕рдПрди, рдЬрд╝рд┐рдк, рдЖрджрд┐ - рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рдПрд╕рдПрд╕рдПрди рдпрд╛ рдЬрд╝рд┐рдк рдХреЛрдб рдХреНрдпреЛрдВ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╛рдордорд╛рддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдк-рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕реЗ RegExp рджреНрд╡рд╛рд░рд╛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? "рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкреНрд░рд╕реНрддрд╛рд╡" рджреЗрдЦреЗрдВ

    • рдкреВрд░реНрдгрд╛рдВрдХ - "3e5" рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

    • рдИрдореЗрд▓ - рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдлрд┐рд░ рднреА, рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдИрдореЗрд▓ рдкрддрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рд╣реИрдВ?

    • CSS рдмреЙрд░реНрдбрд░ рд╕реНрдкреЗрдХреНрд╕ - рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрд╕ DSL рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЯреАрдХ RegEx рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╡рд╣ рд╕реНрд╡рдпрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

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

    • рджрд┐рдирд╛рдВрдХ рдкреНрд░рд╛рд░реВрдк - рдХреИрд╕реЗ/рдХреНрдпреЛрдВ? Date рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ; рдпрджрд┐ рдЗрдирдкреБрдЯ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдЖрддрд╛ рд╣реИ рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

    • рдпреВрдЖрд░рдЖрдИ - рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ fetch host рдХреЛ http(s?): рд╕рд╛рде рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдЧрд╛

TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЪрд┐рдВрддрд╛ "рд╕рдЯреАрдХрддрд╛" рд╣реИ - рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ RegExp рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЖрдордВрддреНрд░рдг рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ? рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣рдордд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рддреНрдпрд╛рдкрди RegExp рдХреА "рд╕рд╣реА рд╡рд░реНрддрдиреА" рдХреНрдпрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рдЯреЙрд╡рд░ рдСрдл рдмреИрдмреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬреЛ URL рдХреЗ рд░реВрдк рдореЗрдВ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╣реЛрд╕реНрдЯ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ, рдИрдореЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ, рдЖрджрд┐, рдФрд░ рдХреЛрдИ рднреА рдЬреЛ рджреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдбрд╛рд▓рдирд╛ рдпрд╛ рд░реЗрдЧреЗрдХреНрд╕ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рд╣реИред

рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рдХрд╛ рдкреНрд░рд╡рд░реНрддрди

рдЪреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдкреВрд░реНрд╡ рд░реЗрдЧреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕реЗ fn рдкрд╣рд▓реЗ рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВред рдпрд╣ рд╕реАрдзрд╛ рдФрд░ рдореВрд▓реНрдпрд╡рд╛рди рд▓рдЧрддрд╛ рд╣реИ, рдЕрдЧрд░ RegEx рдЬрд┐рд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рдкреНрд░рд╕рд┐рджреНрдз рд╣реИред рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ "рдЕрдЧрд░" рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ - рдореЗрд░реА рдпрд╛рджреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕рддреНрдпрд╛рдкрди рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реБрд╡рд┐рдзрд╛ рдирд╛рдордорд╛рддреНрд░ рдпрд╛ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рд╣реИ, рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВред

рдЗрд╕ рдЖрдХрд▓рди рдХреЗ рдкреНрд░рддрд┐-рд╕рд╛рдХреНрд╖реНрдп рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕рдВрдкрддреНрддрд┐ рдХреБрдВрдЬреА/рд░реЗрдЧреЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕

рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдк рдкрд░ рдЯрд╛рдЗрдк рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо aria- рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

interface IntrinsicElements {
    // ....
    [attributeName: /aria-\w+/]: number | string | boolean;
}

рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ (рд╣рдо Regex рдЧреБрдг рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ Regex рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

TODO (рдореИрдВ рдпрд╛ рдХреЛрдИ рднреА): рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред

рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкреНрд░рд╕реНрддрд╛рд╡

рдирд╛рдордорд╛рддреНрд░ рдпрд╛ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

type ZipCode = make_unique_type string;

рдлрд┐рд░ рдЖрдк рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

function asZipCode(s: string): ZipCode | undefined {
    return /^\d\d\d\d\d$/.test(s) ? (s as ZipCode) : undefined;
}

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП "рд╕рдВрдХрд▓рди-рд╕рдордп" рдЬрд╛рдБрдЪ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВред

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ RegExp рдкреНрд░рдХрд╛рд░ рдереЗ рдФрд░ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдереЗ ред рдЧреИрд░-рд╕рддреНрдпрд╛рдкрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (ab) рд╢реБрд░реВ рдХрд░рдирд╛ рдмрд╣реБрдд рд▓реБрднрд╛рд╡рдирд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

type Password = /(IsPassword)?.*/;
type UnescapedString = /(Unescaped)?.*/;
declare function hash(p: Password): string;

const p: Password = "My security is g00d"; // OK
const e: UnescapedString = "<div>''</div>"; // OK
hash(p); // OK
hash(e); // Error
hash("correct horse battery staple"); // OK

рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд░реЗрдЧреЗрдХреНрд╕ рдЯреЗрд╕реНрдЯ рдХреЛрдб рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рднрд▓реЗ рд╣реА рдХреЛрдб рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд▓рд┐рдЯрд░рд▓реНрд╕ рдХреЗ рдмрдЬрд╛рдп рд░рдирдЯрд╛рдЗрдо-рдкреНрд░рджрддреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЪрд▓ рд░рд╣рд╛ рд╣реЛ, рдлрд┐рд░ рднреА рдЖрдк рдХреБрдЫ рд╕рддреНрдпрд╛рдкрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдЯреЗрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ " рд╕рд╣реА"ред рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ/рдмреНрд░рд╛рдВрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдЗрдирдкреБрдЯ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рд╡рд┐рдХрд╛рд╕ рдЪрдХреНрд░ рдХреЗ рдЖрд░рдВрдн рдореЗрдВ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЧреИрд░ рдореБрджреНрджреЛрдВ

рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╣рд▓реБрдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд╡рд░реЛрдзрдХ рдирд╣реАрдВ рдорд╛рдирд╛

рдореЗрдЬрдмрд╛рди рдХреНрд╖рдорддрд╛

рдирдП рд░рдирдЯрд╛рдЗрдо рдкреБрд░рд╛рдиреЗ рд░рдирдЯрд╛рдЗрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ RegExp рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╣рд╛рдБ рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рдХреЛрдб рдорд╛рдиреНрдп рдпрд╛ рдЕрдорд╛рдиреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдирдИ RegExp рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рд░рдирдЯрд╛рдЗрдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдирдИ RegExp рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдХрд╛рдлреА рдЧреВрдврд╝ рд╣реИрдВ рдпрд╛ рд╕рдореВрд╣ рдорд┐рд▓рд╛рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЬреЛ рдпрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИрдВред

рдкреНрд░рджрд░реНрд╢рди

RegExes рдПрдХ рдЕрд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрдбрд╝реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рд╕реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреНрдп рдорд╛рдзреНрдпрдореЛрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдбреЙрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо RegExp рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ ( /\d*/ -> /.*/ ?), рд╕рдВрдШ, рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди, рдФрд░ рдирд┐рд░реНрд╡рд╛рд╕рди

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ /\d+/ рдХреЗ рдЬреНрдЮреЗрдп рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИ /.+/ ред рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ RegExp рджреВрд╕рд░реЗ рдХреЗ рд╢реБрджреНрдз рдЙрдкрд╕рдореБрдЪреНрдЪрдп (рдХреБрдЫ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рддрд╣рдд) рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдо 100% рдареАрдХ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ RegExpes рдЙрдирдХреЗ рдореЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╣рд┐рдд рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ; рдпрд╣ рд╢рд╛рдпрдж рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИред

рдпреВрдирд┐рдпрди рдФрд░ рдЗрдВрдЯрд░рд╕реЗрдХреНрд╢рди рдСрдкрд░реЗрд╢рдВрд╕ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдЬрдм рддрдХ рдХрд┐ рдЕрд╕рд╛рдЗрдирд┐рдмрд┐рд▓рд┐рдЯреА рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдЬрдм рджреЛ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдПрдХ рдЪреМрд░рд╛рд╣реЗ рдкрд░ "рдЯрдХрд░рд╛рддреЗ рд╣реИрдВ", рддреЛ рд╡реЗ never ред рдЬрдм рджреЛ RegExpes рдХреЛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рджреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирдпрд╛ RegExp рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдХреЗрд╡рд▓ /a/ & /b/ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВрдЧреЗред never рдХреЛрдИ рдХрдореА рдирд╣реАрдВ рд╣реЛрдЧреА рд╣рдореЗрдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ (рдпрд╣ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдПрдХ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рд╕рдмрдЯрд╛рдЗрдкрд┐рдВрдЧ)ред

рдЕрдЧрд▓рд╛ рдХрджрдо

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдЧрд▓реЗ рдЪрд░рдг рд╣реИрдВ:

  • рд░реЗрдЧреЗрдХреНрд╕-рдирд╛рдорд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рджрд░реНрдЬ рдХрд░реЗрдВ AKA рд░реЗрдЧреЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдФрд░ рдкреНрд░рд╢рдВрд╕рдиреАрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

    • рдЙрджрд╛рд╣рд░рдг: рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдпрд╛ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬреЛ рдЗрд╕рд╕реЗ рдЕрддреНрдпрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗ

  • рд╕рдордЭреЗрдВ рдХрд┐ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ/рдмреНрд░рд╛рдВрдбреЗрдб рдкреНрд░рдХрд╛рд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ
  • рдЙрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВ рдЬреЛ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ RegExes рдкрд╣рд▓реЗ рд╕реЗ рд╣реА

рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ (https://github.com/hyperhype/hyperscript) рдЬреИрд╕реЗ рдлрдВрдХреНрд╢рди
рдПрдХ рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдорддреМрд░ рдкрд░ h('div#some-id') рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдПрдХ рд░реЗрдЧреЗрдХреНрд╕-рдИрд╢ рдкреИрдЯрд░реНрди рдореИрдЪрд░ h рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ HTMLDivElement рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдИ рднреА рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдкрддреНрддрд┐ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ

declare let width: number;
declare let element: HTMLElement;

element.style.height = `${width}px`;
// ...or
element.style.height = `${width}%`;

CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( element.class#id - рдорд╛рдиреНрдп, div#.name - рдЕрдорд╛рдиреНрдп)

рдпрджрд┐ рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рд╕рдореВрд╣ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ (рдХрд┐рд╕реА рддрд░рд╣) рддреЛ рд▓реЛрджрд╛рд╢ рдХреА get рд╡рд┐рдзрд┐ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');

рдпрд╣ рднреА рдПрдХ рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИ:

interface IOnEvents {
  [key: PatternOf</on[a-z]+/>]: (event: Event) => void;
}

interface IObservablesEndsOn$ {
  [key: PatternOf</\$$/>]: Observable<any>;
}

рдХреЗрд╕ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ: рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рд╣рд╛рдЗрдкрд░рд╣рд╛рдЗрдк/рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕

рд╡рд╣ рд░реЗрдЧреЗрдХреНрд╕ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдпрд╛ рдпрд╣ рдХреНрдпрд╛ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИ?

FWIW рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╛рдорд╛рдВрдХрд┐рдд рдЯреИрдЧ рдирд╛рдореЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдордирдорд╛рдиреЗ рдЯреИрдЧ рдирд╛рдореЛрдВ рдкрд░ рднреА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

> require("hyperscript")("qjz").outerHTML
'<qjz></qjz>'

рдпрд╣ рд╡рд░реНрдЧ рдФрд░ рдЖрдИрдбреА рдорд╛рдиреЛрдВ рдХреЗ рдЕрд╕реАрдорд┐рдд рдорд┐рд╢реНрд░рдг рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

> require("hyperscript")("baz.foo#bar.qua").outerHTML
'<baz class="foo qua" id="bar"></baz>'

CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

рд╡рд╣ рд░реЗрдЧреЗрдХреНрд╕ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдпрд╛ рдпрд╣ рдХреНрдпрд╛ рд╕рддреНрдпрд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИ?

рдУрдкреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╣рд╛рдБ, HTMLDocument#createElement() рдУрд╡рд░рд▓реЛрдб рдЬреИрд╕рд╛ рдХреБрдЫ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// ...
export declare function h(query: /^canvas([\.#]\w+)*$/): HTMLCanvasElement;
// ...
export declare function h(query: /^div([\.#]\w+)*$/): HTMLDivElement;
// ...

рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЖрд░рдИ рдЕрдзреВрд░реЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдЬрдЯрд┐рд▓ рдЪрдпрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ HTMLDocument.querySelector() рд▓рд┐рдП HTMLElement рдХреЛ рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реИред

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдЧреИрд░-рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдФрд░ рдЙрдкрдпреЛрдЧреА рджреЛрдиреЛрдВ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕реАрд╕реАрдПрдХреНрд╕рдЯреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рддрд╛рд░ рд╣реИрдВ рдЬреЛ TickerSymbol s рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд░реЗрдЧреЗрдХреНрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ string рдЙрдк-рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдЖрджрд┐ рдорд┐рд▓рддреА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╛рдпрд╛ рдЬрдм рдореИрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ, рдЗрд╕рдХреЗ рд╕рд╛рде рдореИрдВ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░ рдЯрд┐рдХрд░рд╕рд┐рдВрдмреЛрд▓, рдореБрджреНрд░рд╛рдПрдВ, рд╕рдВрдкрддреНрддрд┐ рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рд╡реЗ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рддрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред

@omidkrad рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ред

@ m93a рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдирд╛рдордорд╛рддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛ

CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреА рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд░реЗрдЧреЗрдХреНрд╕рдкреА рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд╕рд┐рд▓рд╛рдИ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо рд╕реАрдПрд╕рдПрд╕ рд░реЗрдЧреЗрдХреНрд╕ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ..., рд╣реИ рдирд╛?

(рдбреНрд░рд╛рдлреНрдЯ) рд╕реАрдПрд╕рдПрд╕ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓

https://drafts.css-houdini.org/css-typed-om/

https://developers.google.com/web/updates/2018/03/cssom

рдХрдбрд╝реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП CSS рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдо рдХрд░рддрд╛ рд╣реИред

el.attributeStyleMap.set('padding', CSS.px(42));
const padding = el.attributeStyleMap.get('padding');
console.log(padding.value, padding.unit); // 42, 'px'

@RyanCavanaugh рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ^([^#\.\[\]]+) (рдбрд┐рдлрд╝реЙрд▓реНрдЯ "div" ) рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд┐рд▓рд╛рди ^(${htmlTagNames.join("|")}) рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП , рдпрд╣ рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:

type SelectorAttrs = "" | `#${string}` | `.${string}`;

type GetTagName<T extends string> =
    T extends SelectorAttrs ? "div" :
    T extends `${keyof HTMLElementTagNameMap & (infer Tag)}${SelectorAttrs}` ? T :
    string;

рдШрдЯрдирд╛рдУрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмрд╛рд░ рдЕрд╕реНрд╡реАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреА рднреВрдорд┐ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

type EventsForElement<T extends Element> =
    T extends {addEventListener(name: infer N, ...args: any[]): any} ? N : never;

type MithrilEvent<E extends string> =
    (E extends EventsForElement<T> ? HTMLElementEventMap[E] : Event) &
    {redraw?: boolean};

type Attributes<T extends Element> =
    LifecycleAttrs<T> &
    {[K in `on${string}` & not LifecycleAttrs<T>](
        ev: K extends `on${infer E}` ? MithrilEvent<E> : never
    ): void | boolean} &
    {[K in keyof T & not `on${string}`]: T[K]} &
    {[K in string & not keyof T & not `on${string}`]: string};

рдмреАрдЯреАрдбрдмреНрд▓реВ, рдпрд╣ рдирд┐рд░реНрдмрд╛рдз рдПрдХреАрдХрд░рдг рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореИрдВ рдЕрднреА рднреА рд╢рд╛рдмреНрджрд┐рдХ рд░реЗрдЧреЗрдХреНрд╕рдкреНрд╕ рдкрд░ рдЕрдкрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд╢реБрджреНрдз рд░реЗрдЧреЗрдХреНрд╕рдкреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджреА рдЧрдИ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмреЗрдВрдЯ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

bent('json')('https://google.com') // => Promise<JSON>
bent('buffer')('https://google.com') // => Promise<Buffer | ArrayBuffer>
bent('string')('https://google.com') // => Promise<String>

рдпрд╣ рдХреБрдЫ рдЕрдиреНрдп рддрд░реНрдХреЛрдВ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рдзрд┐ рдФрд░ url рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рдпреЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рд╕рднреА рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ ( 'json' | 'buffer' | 'string' ) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЧреВрдВрдЧрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рд╕рдВрдШ рдореЗрдВ рдпреВрдЖрд░рдПрд▓ рдФрд░ рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ string рддрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд▓реА рдХреЙрд▓ рдореЗрдВ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@Ovyerus рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреА рдорджрдж рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ? рдЖрдк рдХреНрдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ? рдЖрдк рдУрд╡рд░рд▓реЛрдб рдпрд╛ рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмреЗрдВрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

type BentResponse<Encoding> = Promise<
    Encoding extends "json" ? MyJsonType :
    Encoding extends "buffer" ? Buffer | ArrayBuffer :
    Encoding extends "string" ? string :
    Response
>;

declare function bent<T extends string>(urlOrEncoding: T): (url: string) => BentResponse<T>;

http://www.typescriptlang.org/play/index.html#code/C4TwDgpgBAQhB2wBKEDOYD29UQDwFF4BjDAEwEt4BzAPigF4oAFAJwwFtydcBYAKCiCohEhWpQIAD2AJSqKACIAVqiwKoAfigBZEAClV8ACrhoALn5DhxMpSoTps + QoBGAVwBmHiC3VaYnt4sUAA + UACCLCwAhiABXj5QFgJCIrbiUjLwcoqowCx2flB5BeLJVijoWDj8NADc-PykEEQANtEs0B5uxMDkWFAuCMC4Rg5ZOSV2NAAUbiytAPIsaWJUZlBGAJQbcwsbU9RbDHRwiJWY2HhG9Y18lDIsHtFE0PFBUADeUAD67gksDbReAgKAAX34Dx8z1eOn0hhMkC + vxUWCBIPBdxm0VQIGIUBmx3odE + liErQgwCgkg2ugMWER0EY0QA7tFyFShogZspDAotjyABbAYBgVBmAD0Eqk0XYYApADoSOx + Q0 + GCBVsgA

рдУрд╣, рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯ рдерд╛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдзрд╛рд░ рдпреВрдЖрд░рдПрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ http(s): рдорд┐рд▓рд╛рди рдХреА рддрд░реНрдЬ рдкрд░ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рдереАред

рдмреЗрдВрдЯ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддрд░реНрдЬ рдкрд░ рдЕрдзрд┐рдХ рд╣реИрдВ

type HttpMethods = 'GET' | 'PATCH' | ...
type StatusCode = number;
type BaseUrl = string; // This is where I would ideally need to see if a string matches http(s):
type Headers = { [x: string]: any; };

type Options = HttpMethods | StatusCode | BaseUrl | Headers;

function bent(...args: Options[]): RequestFunction<RawResponse>
function bent(...args: (Options | 'json')[]): RequestFunction<JSON>
// and so on

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ BaseUrl рд╣реЛрдиреЗ рд╕реЗ HttpMethods рдФрд░ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ string рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдиреЗ рд╕реЗ "рдЕрдиреБрдЪрд┐рдд рд░реВрдк рд╕реЗ" рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рддреБрд▓рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ^http: рдпрд╛ ^https: рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдпреВрдЖрд░рдПрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ, рддреЛ рдореИрдВ рдмреЗрд╕рдпреВрдЖрд░рдПрд▓ рдХреЛ type BaseUrl = /^https?:/ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдпрд╣ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдареАрдХ рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ HTTP рд╡рд┐рдзрд┐ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЙрдиреНрд╣реЗрдВ string рдореЗрдВ рдЕрд╡рд╢реЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рдХрд╛рд░ред

рдмрд┐рд▓реНрдХреБрд▓, рдореИрдВ рд╡рд╣реА рд╣реВрдВред

--
рдкреНрд░реЛрдХреЛрдк рд╕рд┐рдореЗрдХ

20 рдЕрдХреНрдЯреВрдмрд░ 2019 рдХреЛ 03:23:30 рдмрдЬреЗ, рдорд╛рдЗрдХрд▓ рдорд┐рд╢реЗрд▓ ([email protected])
рд▓рд┐рдЦрд╛ рдерд╛:

рдУрд╣, рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯ рдерд╛ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдЕрдзрд┐рдХ рдереА
рдорд┐рд▓рд╛рди http(s): рдЖрдзрд╛рд░ URL рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред

рдмреЗрдВрдЯ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддрд░реНрдЬ рдкрд░ рдЕрдзрд┐рдХ рд╣реИрдВ

рдЯрд╛рдЗрдк рдХрд░реЗрдВ HttpMethods = 'GET' | 'рдкреИрдЪ' | ...рдЯрд╛рдЗрдк рдХрд░реЗрдВ StatusCode = number;type BaseUrl = string; // рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ http(s) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ: рдЯрд╛рдЗрдк рд╣реИрдбрд░ = {[x: рд╕реНрдЯреНрд░рд┐рдВрдЧ]: рдХреЛрдИ рднреА; };
рдкреНрд░рдХрд╛рд░ рд╡рд┐рдХрд▓реНрдк = HttpMethods | StatusCode | рдмреЗрд╕рдпреВрдЖрд░рдПрд▓ | рд╢реАрд░реНрд╖рд▓реЗрдЦ;
рдлрд╝рдВрдХреНрд╢рди рддреБрд▓рд╛ (... args: рд╡рд┐рдХрд▓реНрдк []): RequestFunctionрдлрд╝рдВрдХреНрд╢рди рддреБрд▓рд╛ (... args: (рд╡рд┐рдХрд▓реНрдк | 'json') []): RequestFunction// рдФрд░ рдЗрд╕реА рддрд░рд╣

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ BaseUrl рд╣реЛрдиреЗ рд╕реЗ HttpMethods рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ
рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЬреЛ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛
рдпрд╣ рднреА "рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ" рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рддреБрд▓рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ
^http: рдпрд╛ ^https: рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕реЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдпреВрдЖрд░рдПрд▓.

рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ, рддреЛ рдореИрдВ рдмреЗрд╕рдпреВрдЖрд░рдПрд▓ рдХреЛ рдмреЗрд╕рдпреВрдЖрд░рдПрд▓ = / ^ https?: / рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ред
рдФрд░ рдпрд╣ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдареАрдХ рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ HTTP рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИрдВ рдпрд╛
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рд╕рд╛рде рд╣реА рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрд╡рд╢реЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/microsoft/TypeScript/issues/6579?email_source=notifications&email_token=ABJ3U4JNK3V5MV4DJH73ZU3QPOXJFA5CNFSM4BZLAVSKYY3PNVWWK3TUL52HS4DFVREXG43VMVKA#KTNORZGO542111
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABJ3U4PHBXO4766LK7P7UXDQPOXJFANCNFSM4BZLAVSA
.

рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛ред

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

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

@DanielRosenwasser рдиреАрдЪреЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред http://www.typescriptlang.org/play/index.html#code/C4TwDgpgBAqjCSARKBeKBnYAnAlgOwHMBYAKFIGMAbAQ3XVnQiygG9SoOoxcA3a4aJn45yULBGoATAPZ5KIKAFtq + GIywAuWAmRoA5NQCcEAAwBGQwCMArAFoAZtYBMAdlsAWcvYActw2ZM7JzNJF28TCCcANgtLPXZOAHpErl5 + QWBhUXEpWXklFTw1Ji04JFQoMycAZihkqAA5AHkAFSgAQQAZTqaAdQBRRASOeu4cPgEMTOARMQkZOQVlVXVSnQq9PGlgW2pbAFd9nEk9OpSAZQAJJphO5Ga2gCF + ju6 + рд╡рд╛рд╣ ++ рдмреАрдмреАрдПрд▓-oAlYZQciyTBYfbkYDSLAACkBnC4 + 0slFmxzWSAANHDOGBEcjRJYsNQ8JItKD8ARMSR4fCcUjZuocNRKFo8PtFJYmJTqdjcbNyDkBJJHiA0boGEwAHTLIrqACUrFICQAvqQVSQgA

@yannickglt рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ RegExp рдкреНрд░рдХрд╛рд░? рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд╛рдЗрдЯ-рд╕рддреНрдпрд╛рдкрд┐рдд рдЖрдордВрддреНрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

// OK
someFunc('a9e019b5-f527-4cf8-9105-21d780e2619b');
// Also OK, but probably really bad
someFunc('a9e019b5-f527-4cf8-9106-21d780e2619b');
// Error
someFunc('bfe91246-8371-b3fa-3m83-82032713adef');

IOW рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдпреВрдпреВрдЖрдИрдбреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ .

рддреЛ 3.7 рдХреЗ Assertion Functions рдФрд░ nominal рдлрд╝реАрдЪрд░ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдпрд╣ (?)

nominal UUID = string

function someFunc(uuid: any): asserts uuid is UUID {
  if (!UUID_REGEX.test(uuid)) {
    throw new AssertionError("Not UUID!")
  }
}

class User {
  private static readonly mainUser: UUID = someFunc('a9e019b5-f527-4cf8-9105-21d780e2619b')
  // private static readonly mainUser: UUID = someFunc(123) // assertion fails
  // private static readonly mainUser: UUID = someFunc('not-a-uuid') // assertion fails
  constructor(
    public id: UUID,
    public brand: string,
    public serial: number,
    public createdBy: UUID = User.mainUser) {

  }
}

рдХреНрдпрд╛ рдпрд╣ рднреА рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛?

new User('invalid-uuid', 'brand', 1) // should fail
new User('invalid-uuid' as UUID, 'brand', 1) // ЁЯдФ 

рдХреБрдЫ рджреЗрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ
asserts рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛
Regex-Validation рдПрдХ рд╕рдВрдХрд▓рди-рд╕рдордп рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ->
рдЕрдиреНрдпрдерд╛, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдПрдХ рдФрд░ рдореБрджреНрджрд╛: someFunc(uuid: any): asserts uuid is UUID рдПрдХ рдпреВрдпреВрдЖрдИрдбреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрд╛ рджреЗрддрд╛ рд╣реИ is UUID -> true ред
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреВрдпреВрдЖрдИрдбреА рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ mainUser рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

@RyanCavanaugh рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрдиреНрд╣реЗрдВ

// <div id="hello"></div>
m("div#hello", {
    oncreate(vnode) { const dom: HTMLDivElement = vnode.dom },
})

// <section class="container"></section>
m("section.container", {
    oncreate(vnode) { const dom: HTMLElement = vnode.dom },
})

// <input type="text" placeholder="Name">
m("input[type=text][placeholder=Name]", {
    oncreate(vnode) { const dom: HTMLInputElement = vnode.dom },
})

// <a id="exit" class="external" href="https://example.com">Leave</a>
m("a#exit.external[href='https://example.com']", {
    oncreate(vnode) { const dom: HTMLAnchorElement = vnode.dom },
}, "Leave")

// <div class="box box-bordered"></div>
m(".box.box-bordered", {
    oncreate(vnode) { const dom: HTMLDivElement = vnode.dom },
})

// <details></details> with `.open = true`
m("details[open]", {
    oncreate(vnode) { const dom: HTMLDetailsElement = vnode.dom },
})

// alias for `m.fragment(attrs, ...children)`
m("[", {
    oncreate(vnode) { const dom: HTMLElement | SVGElement = vnode.dom },
}, ...children)

рд╣рдо рдЗрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

// selector must be non-empty
m("")

// incomplete class
m("div.")

// incomplete ID
m("div#")

// incomplete attribute
m("div[attr=")

// not special and doesn't start /[a-z]/i
m("@foo")

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╣рдо рдЗрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрддрдиреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЗрдирдХреЗ рдмрд┐рдирд╛ рдЬреАрд╡рд┐рдд рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ:

// event handers must be functions
m("div[onclick='return false']")

// `select.selectedIndex` is a number
m("select[selectedIndex='not a number']")

// `input.form` is read-only
m("input[type=text][form='anything']")

// `input.spellcheck` is a boolean, this evaluates to a string
// (This is a common mistake, actually.)
m("input[type=text][spellcheck=false]")

// invalid tag name for non-custom element
m("sv")

рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рд╡рд┐рдлрд▓рддрд╛ рд╕рдВрджреЗрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдЪреЗрдХ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рдХреНрдпреЛрдВ рд╣реБрдЖред

рдЕрдиреНрдп рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдЖрдзрд╛рд░рд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рд╕рдорд╛рди рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВред

рдЙрдореНрдореАрдж рд╣реИ рдпреЗ рдорджрдж рдХрд░реЗрдЧрд╛!

@isiahmeadows рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрдпрдирдХрд░реНрддрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рд╕рд╣реА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдВрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рдПрдЧрд╛ред рдкрд╕рдВрдж:

m(mt.div({ attr1: 'val1' }))

@anion155 рд╡рд╣рд╛рдВ m("div", {...attrs}, ...children) рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рд╣рд╛рдЗрдкрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреАрдиреА рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ (рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди), рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдм рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрдзреАрд░ рд╣реВрдБред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬрд╛рд░реА рдХрд░реВрдВрдЧрд╛ред

https://github.com/microsoft/TypeScript/issues/6579#issuecomment -542405537

"рд╕рдЯреАрдХрддрд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдпрд╛рд░, рдореБрдЭреЗ рд╡рд╣ рд╢рдмреНрдж рдкрд╕рдВрдж рд╣реИ),
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реНрдг рдЯреНрдпреВрд░рд┐рдВрдЧ рд╣реИред
рдЗрд╕рдХрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐-рд╕рдЯреАрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
(рдЬреИрд╕реЗ, рд╕рднреА SQL рдХреЛ рдореЙрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛? рдмреЗрд╢рд░реНрдо рдкреНрд▓рдЧ = P)

рд▓реЗрдХрд┐рди рдЖрдк (рдмрд╣реБрдд рд╕реЗ) рд▓реЛрдЧреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реБрдП рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдкрд╛рдЧрд▓ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓реЗрдЦрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрддрд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ... рд╣реИ рдирд╛?

рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░/рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХрд╛рдордирд╛ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдХреЛрдб рдмреЗрд╕ рдХреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХреА рд╣реЛрдЧреАред


рдЙрджрд╛рд╣рд░рдг

рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ, рдореИрдВ рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВред (рд╡рд╣рд╛рдБ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдФрд░ рднреА рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рднреБрд▓рдХреНрдХрдбрд╝ рдкреНрд░рд╛рдгреА рд╣реВрдБ)

рд╕реНрдЯреНрд░рд╛рдЗрдк рдХреЗ рдПрдкреАрдЖрдИ (рдПрдХ рднреБрдЧрддрд╛рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдордВрдЪ) рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп, рд╡реЗ ch_ рдХрд╛ рдЙрдкрдпреЛрдЧ charge -рд╕рдВрдмрдВрдзрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, re_ рд▓рд┐рдП refund -рд╕рдВрдмрдВрдзрд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рдЙрдиреНрд╣реЗрдВ PatternOf</^ch_.+/> рдФрд░ PatternOf</^re_.+/> рд╕рд╛рде рдПрдиреНрдХреЛрдб рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ред

рдЗрд╕ рддрд░рд╣, рдЯрд╛рдЗрдкреЛ рдмрдирд╛рддреЗ рд╕рдордп,

charge.insertOne({ stripeChargeId : someObj.refundId });

рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА,

Cannot assign `PatternOf</^re_.+/>` to `PatternOf</^ch_.+/>`

рдЬрд┐рддрдирд╛ рдореИрдВ рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдФрд░ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рд╣реИрдВред
рдореИрдВ рд╣рдореЗрд╢рд╛ рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдЯреАрдПрд╕ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЙрдбрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдкреНрд░реЗрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реЛрддреЗ рд╣реИрдВред
рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
(рдареАрдХ рд╣реИ, рдореИрдВ рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред рд╡реЗ рдХреЗрд╡рд▓ unique symbol рдХрд╛рд░рдг рдЙрдкрдпреЛрдЧреА рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВред)

рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП "ValueObject" рдкреИрдЯрд░реНрди рдФрд░ рднреА рдЦрд░рд╛рдм рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдКрдВрдЧрд╛ред


рддреБрд▓рдирд╛

рдиреАрдЪреЗ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддреБрд▓рдирд╛ рдХрд░реВрдВрдЧрд╛,

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░/рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░
  • рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░
  • рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░

рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "ValueObject" рдкреИрдЯрд░реНрди рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕рдорд╛рдзрд╛рди рд╣реИ, рдФрд░ рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?


рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░

const stripeChargeIdRegex = /^ch_.+/;
const stripeRefundIdRegex = /^re_.+/;

type StripeChargeId = PatternOf<typeof stripeChargeIdRegex>;
type StripeRefundId = PatternOf<typeof stripeRefundIdRegex>;

declare function takesStripeChargeId (stripeChargeId : StripeChargeId) : void;

declare const str : string;
takesStripeChargeId(str); //Error
if (stripeChargeIdRegex.test(str)) {
  takesStripeChargeId(str); //OK
}
if (stripeRefundIdRegex.test(str)) {
  takesStripeChargeId(str); //Error
}

declare const stripeChargeId : StripeChargeId;
declare const stripeRefundId : StripeRefundId;
takesStripeChargeId(stripeChargeId); //OK
takesStripeChargeId(stripeRefundId); //Error

takesStripeChargeId("ch_hello"); //OK
takesStripeChargeId("re_hello"); //Error

рдЙрд╕ рдУрд░ рджреЗрдЦреЛред

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реАред
  • string рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред

рдирд╛рдордорд╛рддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░...

const stripeChargeIdRegex = /^ch_.+/;
const stripeRefundIdRegex = /^re_.+/;

type StripeChargeId = make_unique_type string;
type StripeRefundId = make_unique_type string;

function isStripeChargeId (str : string) : str is StripeChargeId {
  return stripeChargeIdRegex.test(str);
}
function isStripeRefundId (str : string) : str is StripeRefundId {
  return stripeRefundIdRegex.test(str);
}

declare function takesStripeChargeId (stripeChargeId : StripeChargeId) : void;

declare const str : string;
takesStripeChargeId(str); //Error
if (isStripeChargeId(str)) {
  takesStripeChargeId(str); //OK
}
if (isStripeRefundId(str)) {
  takesStripeChargeId(str); //Error
}

declare const stripeChargeId : StripeChargeId;
declare const stripeRefundId : StripeRefundId;
takesStripeChargeId(stripeChargeId); //OK
takesStripeChargeId(stripeRefundId); //Error

takesStripeChargeId("ch_hello"); //Error? Ughhhh
takesStripeChargeId("re_hello"); //Error

takesStripeChargeId("ch_hello" as StripeChargeId); //OK, BUT UNSAFE
takesStripeChargeId("re_hello" as StripeChargeId); //OK, BUT WAIT! I MESSED UP

const iKnowThisIsValid = "ch_hello";
if (isStripeChargeId(iKnowThisIsValid)) {
  takesStripeChargeId(iKnowThisIsValid); //OK
} else {
  throw new Error(`Wat? This should be valid`);
}

function assertsStripeChargeId (str : string) : asserts str is StripeChargeId {
  if (!isStripeChargeId(str)) {
    throw new Error(`Expected StripeChargeId`);
  }
}
assertsStripeChargeId(iKnowThisIsValid);
takesStripeChargeId(iKnowThisIsValid); //OK

function makeStripeChargeIdOrError (str : string) : StripeChargeId {
  assertsStripeChargeId(str);
  return str;
}
takesStripeChargeId(makeStripeChargeIdOrError("ch_hello")); //OK
takesStripeChargeId(makeStripeChargeIdOrError("re_hello")); //OK, compiles, throws during run-time... Not good

рдЙрд╕ рдУрд░ рджреЗрдЦреЛред

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдмрд╛рдзрд╛ рдкрд░ рдХрд╛рдмреВ рдкрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ... рд╣реИ рдирд╛?

рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рд╣реИред
рддреЛ, рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред


рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░...

рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВ...

const stripeChargeIdRegex = /^ch_.+/;
const stripeRefundIdRegex = /^re_.+/;

type StripeChargeId = string & tag { stripeChargeId : void };
type StripeRefundId = string & tag { stripeRefundId : void };

function isStripeChargeId (str : string) : str is StripeChargeId {
  return stripeChargeIdRegex.test(str);
}
function isStripeRefundId (str : string) : str is StripeRefundId {
  return stripeRefundIdRegex.test(str);
}

declare function takesStripeChargeId (stripeChargeId : StripeChargeId) : void;

declare const str : string;
takesStripeChargeId(str); //Error
if (isStripeChargeId(str)) {
  takesStripeChargeId(str); //OK
}
if (isStripeRefundId(str)) {
  takesStripeChargeId(str); //Error
}

declare const stripeChargeId : StripeChargeId;
declare const stripeRefundId : StripeRefundId;
takesStripeChargeId(stripeChargeId); //OK
takesStripeChargeId(stripeRefundId); //Error

takesStripeChargeId("ch_hello"); //Error? Ughhhh
takesStripeChargeId("re_hello"); //Error

takesStripeChargeId("ch_hello" as StripeChargeId); //OK, BUT UNSAFE
takesStripeChargeId("re_hello" as StripeChargeId); //OK, BUT WAIT! I MESSED UP

const iKnowThisIsValid = "ch_hello";
if (isStripeChargeId(iKnowThisIsValid)) {
  takesStripeChargeId(iKnowThisIsValid); //OK
} else {
  throw new Error(`Wat? This should be valid`);
}

function assertsStripeChargeId (str : string) : asserts str is StripeChargeId {
  if (!isStripeChargeId(str)) {
    throw new Error(`Expected StripeChargeId`);
  }
}
assertsStripeChargeId(iKnowThisIsValid);
takesStripeChargeId(iKnowThisIsValid); //OK

function makeStripeChargeIdOrError (str : string) : StripeChargeId {
  assertsStripeChargeId(str);
  return str;
}
takesStripeChargeId(makeStripeChargeIdOrError("ch_hello")); //OK
takesStripeChargeId(makeStripeChargeIdOrError("re_hello")); //OK, compiles, throws during run-time... Not good

рдЙрд╕ рдУрд░ рджреЗрдЦреЛред

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП
  • рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдмрд╛рдзрд╛ рдкрд░ рдХрд╛рдмреВ рдкрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ... рд╣реИ рдирд╛?

рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рд╣реИред
рддреЛ, рдпрд╣ рдПрдХ рднрдпрд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рд╕рд╛рде рд╣реА, рдпрд╣ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ (рд╣реЗ, рдкрди) рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд╣реИред

рдлрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ StripeChargeId рдФрд░ StripeRefundId рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рднрд▓реЗ рд╣реА рдХреЛрдб рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИ, рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВред (рдореИрдВ рдЗрд╕реЗ рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдБрдЧрд╛, рдореИрдВ рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реВрдБ)ред


рдирд┐рд╖реНрдХрд░реНрд╖

рдпрд╣ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ! рдореЗрд░реЗ рд╕рдордЧреНрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд╣реАрдВ!

рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░/рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реИрдВред рдЙрдореНрдореАрдж рд╣реИ, рдореЗрд░реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдирд╣реАрдВ рдереЗ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖ (рдЕрддрд┐рд░рд┐рдХреНрдд)

рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ, рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд▓реЗрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ/рдореВрд▓реНрдп-рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд▓реЗрдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг,

  • string рд╢рд╛рдмреНрджрд┐рдХ
  • number рд╢рд╛рдмреНрджрд┐рдХ ( NaN, Infinity, -Infinity рдЫреЛрдбрд╝рдХрд░)
  • boolean рд╢рд╛рдмреНрджрд┐рдХ
  • bigint рд╢рд╛рдмреНрджрд┐рдХ
  • рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ unique symbol рднреА рдХреЗрд╡рд▓ symbol рд╕рдмрд╕реЗрдЯ рд▓реЗ рд░рд╣рд╛ рд╣реИ

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ, рдХреЗрд╡рд▓ boolean "рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдорд┐рдд" рд╣реИред рдЗрд╕рдХреЗ рдХреЗрд╡рд▓ рджреЛ рдорд╛рди рд╣реИрдВред
рдбреЗрд╡рд▓рдкрд░ true рдФрд░ false рд╢рд╛рдмреНрджрд┐рдХ рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред


number рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рдорд┐рдд-рдИрд╢ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореВрд▓реНрдп рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ рдЕрдирдВрдд рднреА рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдХрд┐рди рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рднреА рдЫреЗрдж рд╣реИрдВред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╢реНрд░реЗрдгреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдХрд╛рд░, рдФрд░ NaN, Infinity, -Infinity рдореБрджреНрджреЗ рдЗрддрдиреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ, рдФрд░ рдкреЙрдк рдЕрдк рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВред рдПрдХ рдЕрдирдВрдд рд╕реЗрдЯ рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░рд┐рдорд┐рдд рд╕реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

рдХрд┐рд╕реА рд╢реНрд░реЗрдгреА рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрдо/рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдХреЛ рдЕрдирдВрдд рд╕реЗрдЯ рдХреЗ рдмрдбрд╝реЗ рдкрд░рд┐рдорд┐рдд/рдЕрдирдВрдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


bigint рдкреНрд░рдХрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдирдВрдд рд╣реИ, рдХреЗрд╡рд▓ рд╕реНрдореГрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред

рдпрд╣ рд╢реНрд░реЗрдгреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореБрджреНрджреЗ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рднреА рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред


string рдкреНрд░рдХрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдирдВрдд рд╣реИ, рдХреЗрд╡рд▓ рд╕реНрдореГрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред

рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░/рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдореБрджреНрджрд╛ рдЗрддрдирд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред

рд░реЗрдЧреЗрдХреНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо/рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЕрдирдВрдд рд╕реЗрдЯ рдХреЗ рдмрдбрд╝реЗ рдкрд░рд┐рдорд┐рдд/рдЕрдирдВрдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


symbol рдкреНрд░рдХрд╛рд░... рдпрд╣ рднреА рдЕрдирдВрдд рд╣реИред рдФрд░ рдЕрд╕реАрдо рднреА, рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ред

рд▓реЗрдХрд┐рди symbol рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡ рд▓рдЧрднрдЧ рд╣рд░ рддрд░рд╣ рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХрд╛рдлреА рд╣рдж рддрдХ рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдФрд░, рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рдиреЗ рднреА рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ, "рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ symbol рдПрдХ рдмрдбрд╝рд╛ рдкрд░рд┐рдорд┐рдд/рдЕрдирдВрдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?"ред

рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд╡рд╛рд▓ рд╕рдордЭ рдореЗрдВ рднреА рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ (рджрд╛рдПрдВ?)


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЗрд╡рд▓ рдЖрджрд┐рдо рдХреЗ рд╕рдмрд╕реЗрдЯ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рднреА рдЬрд░реВрд░рдд рд╣реИ,

  • рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд┐рдирд╛ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рд╣рд┐рддреНрдп рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╢реБрдХреНрд░ рд╣реИ, TS рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордЭрджрд╛рд░ рд╣реИред

false рд╕реЗ (arg : false) => void рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ!

  • рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрд░реАрдХреЗ

    рдлрд┐рд▓рд╣рд╛рд▓, рдЗрди рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ == рдФрд░ === рдХреЛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрд░реАрдХреЗ рд╣реИрдВред

    рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрд╛рд░реНрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!

рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ/рдореВрд▓реНрдп-рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рджреЛ рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред рд╡реЗ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рднрджреНрджреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рдлреА рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╡реИрд╕реЗ рднреА рд╡рд╕реНрддреБ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╢реНрд░рдорджрдХреНрд╖рддрд╛ рд╢рд╛рд╕реНрддреНрд░

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдмрдирд╛рдо рдирд╛рдордорд╛рддреНрд░ рдмрдирд╛рдо рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред

рдпреЗ рддрд░реНрдХ https://github.com/microsoft/TypeScript/issues/15480 рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред


рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧрддрддрд╛

рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧрддрддрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╣реИрдВред
рдпрд╣ рджреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ unique symbol рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЯрд░рдСрдкрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред
рдпрд╣ рдмрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб, рдпрд╛ рдЯреНрд░рд╕реНрдЯ-рдореА-рдСрдкрд░реЗрдЯрд░ ( as ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдПрдХ рдЕрднрд┐рдХрдерди рдЧрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рднреА рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд╛рдордорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реИ ...
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп (рдКрдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред


рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп A рдореЗрдВ рд╣реИ,

//Lowercase 'S'
type StripeChargeId = string & tag { stripeChargeId : void };

рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп B рд╣реИ,

//Uppercase 'S'
type StripeChargeId = string & tag { StripeChargeId : void };

//Or
type StripeChargeId = string & tag { isStripeChargeId : true };

//Or
type StripeChargeId = string & tag { stripe_charge_id : void };

рдлрд┐рд░ рдЖрдкрдХреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб, рдпрд╛ рдЯреНрд░рд╕реНрдЯ-рдореА-рдСрдкрд░реЗрдЯрд░ ( as ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЖрдкрдХреЛ рдПрдХ рдЕрднрд┐рдХрдерди рдЧрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рднреА рдЕрдзрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдареАрдХ рд╣реИ ...
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдмрд╣реБрдд рд╣реА рдЕрд╕рдВрдЧрдард┐рдд (рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред


рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп A рдореЗрдВ рд╣реИ,

type stripeChargeIdRegex = /^ch_.+/;
type StripeChargeId = PatternOf<typeof stripeChargeIdRegex>;

рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп B рд╣реИ,

//Extra dollar sign at the end
type stripeChargeIdRegex = /^ch_.+$/;
type StripeChargeId = PatternOf<typeof stripeChargeIdRegex>;

//Or,
type stripeChargeIdRegex =/^ch_[a-zA-Z0-9]$/;
type StripeChargeId = PatternOf<typeof stripeChargeIdRegex>;

//Or,
type stripeChargeIdRegex =/^ch_[A-Za-z0-9]$/;
type StripeChargeId = PatternOf<typeof stripeChargeIdRegex>;

рдорд╛рди рд▓реЗрдВ рдХрд┐ рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдореЗрд╢рд╛ StripeChargeId рд▓рд┐рдП рддрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп A рдЕрдкрдиреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл "рдЖрд▓рд╕реА" рд╣реИред рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп B рдЗрд╕рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд╕рд╛рде "рдХрдареЛрд░" рд╣реИред

рдлрд┐рд░, рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЯрд╛рдЗрдкрдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ libraryB.stripeChargeIdRegex.test(libraryA_stripeChargeId) рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯреНрд░рд╕реНрдЯ-рдореА-рдСрдкрд░реЗрдЯрд░ ( as ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ рдЕрднреА рднреА рдЕрднрд┐рдХрдерди рдЧрд╛рд░реНрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

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


рдпрджрд┐ рдЖрдкрдХреЛ рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВ! рдореЗрд░реА рдмрд╛рдд рд╕реБрдиреЛред

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

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


рдХреНрд░реЙрд╕-рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧрддрддрд╛

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

image


рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ) рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИред


рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг) рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕ рд╕рдорд╛рди рд╣реИред

рдпрд╛ рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреАрдПрд╕рдкреАрдПрд╕реАрдИ-рдкреВрд░реНрдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕ рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ? рд╣рдо рдпрд╣ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕ рдХреЗ рдХреМрди рд╕реЗ рдЙрдк-рд╡рд░реНрдЧ рд╕рдмрд╕реЗ рдЖрдо рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдордХрдХреНрд╖ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд░реЗрдЧреЗрдХреНрд╕ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдмрдирд╛ рджреЗрдЧрд╛ред рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд░реЗрдВрдЬ рд╕рдмрдЯрд╛рдЗрдк рдЪреЗрдХ рд╕реЗ рдирдВрдмрд░ рд░реЗрдВрдЬ рдЯрд╛рдЗрдк рдкреНрд░рдкреЛрдЬрд▓ рдХреЛ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ред

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ]
рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ,
https://github.com/microsoft/TypeScript/issues/6579#issuecomment -243338433

рдХрд┐рд╕реА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ,
https://bora.uib.no/handle/1956/3956

рд╢реАрд░реНрд╖рдХ, "рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд╡реЗрд╢рди рд╕рдорд╕реНрдпрд╛"
[/ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ]


рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ

TODO (рд▓реЗрдХрд┐рди рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рд╕реЗ рдХрдо рд╣реЛрддреА рд╣реИ)

рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╣реНрд╡рд╛рди

TODO (рд▓реЗрдХрд┐рди рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╣реНрд╡рд╛рди рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ)

рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╣реНрд╡рд╛рди

TODO (рд▓реЗрдХрд┐рди рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╣реНрд╡рд╛рди рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ)

https://github.com/microsoft/TypeScript/issues/6579#issuecomment -542405537 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА

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

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд▓реЛрдЧ рдЪреМрд░рд╛рд╣реЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреНрдпреЛрдВ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред


рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рд░ рдЕрд╢рд╛рдмреНрджрд┐рдХ рдЖрд╣реНрд╡рд╛рди рдХреЛ рддреЛрдбрд╝рдирд╛?

рдЦреИрд░, рд╣рд░ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВред

declare function foo (arg : PatternOf</a+/>) : void;
function bar (arg : PatternOf</a+/>) : void {
  //non-literal and does not break.
  foo(arg);
}
bar("aa"); //OK
bar("bb"); //Error
bar("" as string); //Error, I know this is what you meant by non-literal invocation

function baz (arg : "car"|"bar"|"tar") : void {
  bar(arg); //OK
}

рдПрдХ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЖрдордВрддреНрд░рдг рдкрд░ рддреЛрдбрд╝рдирд╛, рдЬрд╣рд╛рдВ рдпрд╣ рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдмреБрд░реА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЯрд╛рдЗрдк-рд╕реЗрдлреНрдЯреА рдЪреАрдЬ рд╣реИред

рдпрд╣ рдХрд╣рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдЦрд░рд╛рдм рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЖрдордВрддреНрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░/рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреЗ рдпреВрдирд┐рдпрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред


рдХрд┐рд╕реА рднреА рдЕрд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреБрди: рдкрд░реАрдХреНрд╖рдг рдпрд╛ рдЕрднрд┐рдХрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

рдореИрдВ рдЗрд╕реЗ рдПрдХ рдореБрджреНрджреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред
рдпрд╣ рдЕрднреА рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИред
рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ string рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рд╕рдВрдХреБрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ const ZipCode = /^\d\d\d\d\d$/; рдФрд░ ZipCode.test(s) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред


  • рд╣рд▓ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ (рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕рд╣рд┐рдд рдЬреЛ рдЕрднреА рддрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ)

рдЦреИрд░, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИрдВред

  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рд╛рд░реНрдердХ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ

рдЙрд╣... рдореИрдВ рдЙрд╕ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реВрдВ...

  • рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред


TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдирд╛рдордорд╛рддреНрд░/рдЪрд┐рд╣реНрдирд┐рдд рдкреНрд░рдХрд╛рд░ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЬреЛ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рд╡рд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдордорд╛рддреНрд░/рдЪрд┐рд╣реНрдирд┐рдд рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдордиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐, рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рднреА,

  • рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИрдВ
  • рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рдорд╛рддреНрд░рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИ

рд╕рд╛рде рд╣реА, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдмреНрджрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрд╕рдВрддреЛрд╖рдЬрдирдХ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдИрдореЗрд▓ рд╕рддреНрдпрд╛рдкрди рдЬреИрд╕реА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЪреАрдЬреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИрдВред


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

рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рд░рди-рдЯрд╛рдЗрдо рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ред рдФрд░ рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд░рди-рдЯрд╛рдЗрдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЧрд▓рддреА рд╕реЗ рдЕрдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рджреЗ рджреЗрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдк рдЧрд╛рд░реНрдб рдпрд╛ рдЯреНрд░рд╕реНрдЯ-рдореА-рдСрдкрд░реЗрдЯрд░ ( as ) рдпрд╛ рд╡реИрд▓реНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЕрдм рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рд░рди-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред .

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

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

рдФрд░ рдЕрдЧрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдбреЙрдЧрдлреВрдб рдХрд░рддреЗ рд╕рдордп рд╣рд░ рдЬрдЧрд╣ рд╕рд┐рд░реНрдл as рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ... рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХрд╛ рдХреНрдпрд╛? рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдЬрдЧрд╣ as рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рддреЗ рд╕рдордп рд░рди-рдЯрд╛рдЗрдо рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХрд╛ рдореЛрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛?

рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рд╣рд░ рдЬрдЧрд╣ as рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрдо рдХрд╛рд░рдг рд╣реИ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЗрдЦрдХ рдФрд░ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрднреЛрдХреНрддрд╛ рджреЛрдиреЛрдВ рд╣реА рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВрдЧреЗред

(рдПрдХ рддрд░рд╣ рдХреА рд▓рдВрдмреА рд╣рд╡рд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рдХреБрдЫ рдЕрдВрдХ рдорд┐рд▓ рдЧрдП рд╣реИрдВ)ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддрд╛ рд╣реВрдВ (рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд╕ рдЯреАрдо рднреА рдРрд╕рд╛ рдХрд░рддреА рд╣реИ)ред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд string рд╢рд╛рдмреНрджрд┐рдХ рдореЗрд░реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕ рдЪреЗрдХ рд╡рд┐рдлрд▓/рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред рдлрд┐рд▓рд╣рд╛рд▓, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░рди-рдЯрд╛рдЗрдо рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдФрд░ рдЕрдЧрд░ рдпрд╣ рдореЗрд░реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ/рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛрдЧрд╛ рдХрд┐ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрднреЛрдХреНрддрд╛ рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ (рдпрд╛ рд╕рдорд╛рди рд╡рд╛рд▓реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рд╣рдореЗрдВ рдмрд╛рдмреЗрд▓ рдХреЗ рдЯреЙрд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ ...

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рднреА рд╕рдЪ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реЗ рдХреНрд░реЙрд╕-рд▓рд╛рдЗрдмреНрд░реЗрд░реА/рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ ...

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░реЗрдЧреЗрдХреНрд╕/рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдирд╣реАрдВ рдкрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рд╣реИ (рдЙрдореНрдореАрдж рд╣реИ, рдорд╛рдирдХреАрдХрд░рдг рдФрд░ рд╕рдордЭрджрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)ред


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд░реЗрдЧреЗрдХреНрд╕ рдЯреЗрд╕реНрдЯ рдХреЛрдб рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рднрд▓реЗ рд╣реА рдХреЛрдб рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд▓рд┐рдЯрд░рд▓реНрд╕ рдХреЗ рдмрдЬрд╛рдп рд░рдирдЯрд╛рдЗрдо-рдкреНрд░рджрддреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЪрд▓ рд░рд╣рд╛ рд╣реЛ, рдлрд┐рд░ рднреА рдЖрдк рдХреБрдЫ рд╕рддреНрдпрд╛рдкрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдЯреЗрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ " рд╕рд╣реА"ред рдпрд╣ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирд╛рдордорд╛рддреНрд░/рдЯреИрдЧ/рдмреНрд░рд╛рдВрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ (рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░реАрдХреНрд╖рдг рдЗрдирдкреБрдЯ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА рд╡рд┐рдХрд╛рд╕ рдЪрдХреНрд░ рдХреЗ рдЖрд░рдВрдн рдореЗрдВ рдзреНрд╡рдЬрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЖрд╣... рдореБрдЭреЗ рдпрд╣ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдм рдХреБрдЫ рдкрдврд╝ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛...

рд╡реИрд╕реЗ рднреА, рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред


HTTP рдорд╛рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдЗрд╕ рд▓рд┐рдмрд░реА рдХреЗ рд╕рд╛рде, рдЖрдк HTTP рд░реВрдЯ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдШреЛрд╖рдгрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред

/*snip*/
createTestCard : f.route()
    .append("/platform")
    .appendParam(s.platform.platformId, /\d+/)
    .append("/stripe")
    .append("/test-card")
/*snip*/

.append() рд▓рд┐рдП рдпреЗ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ,

  • рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЕрдХреНрд╖рд░ (рдЗрд╕ рд╕рдордп рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдХрдЪрд░рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ)
  • рдЕрдЧреНрд░рдгреА рдлрд╝реЙрд░рд╡рд░реНрдб рд╕реНрд▓реИрд╢ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ( / )
  • рдЕрдиреБрдЧрд╛рдореА рдлрд╝реЙрд░рд╡рд░реНрдб рд╕реНрд▓реИрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ( / )
  • рдХреЙрдирд▓рди рд╡рд░реНрдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ( : ); рдпрд╣ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ
  • рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ, рдлрд╝реЙрд░рд╡рд░реНрдб рд╕реНрд▓реИрд╢ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП ( // )

рдЕрднреА, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрдирдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд░рди-рдЯрд╛рдЗрдо рдЪреЗрдХ рд╣реИрдВ, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдХреБрдЫ Github README рдпрд╛ JSDoc рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрди рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдкрдбрд╝реЗред рдмрд╕ рдкрде рд▓рд┐рдЦреЗрдВ рдФрд░ рд▓рд╛рд▓ рд░рдВрдЧ рдХреА рдЯреЗрдврд╝реА-рдореЗрдврд╝реА рд░реЗрдЦрд╛рдПрдВ рджреЗрдЦреЗрдВред


рдЕрдиреНрдп рд╕рд╛рдорд╛рди

рдореЗрд░реЗ рдкрд╛рд╕ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рдЕрд▓реНрдлрд╝рд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рднреА рд╣реИрдВред

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рднреА рд╣реИ,

const floatingPointRegex = /^([-+])?([0-9]*\.?[0-9]+)([eE]([-+])?([0-9]+))?$/;

рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрд╛,

рдкреВрд░реНрдгрд╛рдВрдХ - "3e5" рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рднреА рд╣реИ, рдЬреЛ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд░реЗрдЧреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди floatingPointRegex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ,

function parseFloatingPointString (str : string) {
    const m = floatingPointRegex.exec(str);
    if (m == undefined) {
        return undefined;
    }
    const rawCoefficientSign : string|undefined = m[1];
    const rawCoefficientValue : string = m[2];
    const rawExponentSign : string|undefined = m[4];
    const rawExponentValue : string|undefined = m[5];

    const decimalPlaceIndex = rawCoefficientValue.indexOf(".");
    const fractionalLength = (decimalPlaceIndex < 0) ?
        0 :
        rawCoefficientValue.length - decimalPlaceIndex - 1;

    const exponentValue = (rawExponentValue == undefined) ?
        0 :
        parseInt(rawExponentValue) * ((rawExponentSign === "-") ? -1 : 1);

    const normalizedFractionalLength = (fractionalLength - exponentValue);
    const isInteger = (normalizedFractionalLength <= 0) ?
        true :
        /^0+$/.test(rawCoefficientValue.substring(
            rawCoefficientValue.length-normalizedFractionalLength,
            rawCoefficientValue.length
        ));
    const isNeg = (rawCoefficientSign === "-");

    return {
        isInteger,
        isNeg,
    };
}

рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рднреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐,

/**
    Just because a string is in integer format does not mean
    it is a finite number.

    ```ts
    const nines_80 = "99999999999999999999999999999999999999999999999999999999999999999999999999999999";
    const nines_320 = nines_80.repeat(4);
    //This will pass, 320 nines in a row is a valid integer format
    integerFormatString()("", nines_320);
    //Infinity
    parseFloat(nines_320);
    ```
*/

RegExp рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░

рдордЬреЗрджрд╛рд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд, RegExp рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рд░реЗрдЧреЗрдХреНрд╕-рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд▓рд╛рдн рд╣реЛрдЧрд╛!

рдЕрднреА рддреЛ рд╣реИ,

new(pattern: string, flags?: string): RegExp

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдХрд░ рд╕рдХрддреЗ рдереЗ,

new(pattern: string, flags?: PatternOf</^[gimsuy]*$/>): RegExp

рдЯреАрдПрд▓; рдбреАрдЖрд░ (рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдкрдврд╝реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ: рд░реЛрдирд╛:)

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдирд╛рдордорд╛рддреНрд░/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реИрдВ

    • рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рд╛рдВрдХреЗрддрд┐рдХ/рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЯреИрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯреЙрд╡рд░ рдСрдлрд╝ рдмреИрдмреЗрд▓ рд╕реНрдерд┐рддрд┐ рдмрдирдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛрддреА рд╣реИ

    • рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реЗрдЧреЗрдХреНрд╕ рдЙрдкрдкреНрд░рдХрд╛рд░ рдЬрд╛рдВрдЪ рдХреЗ рд╕рд╛рде

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ string рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдбрд╝реЗ рдкрд░рд┐рдорд┐рдд/рдЕрдирдВрдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рддрд░реАрдХрд╛ рд╣реИ

    • рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рд▓реЛрдЧ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ!

  • рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рд╕рдВрдХрд▓рди-рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реНрдпрд╛рдкрдХрддрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рджреЗрдВ ... рднрд╛рдЧ рдЬрд╛рддрд╛ рд╣реИ )

    • RegExp рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рд╣реЗрдХреНрд╕/рдЕрд▓реНрдлрд╝рд╛рдиреНрдпреВрдореЗрд░рд┐рдХ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рд░реВрдЯ рдкрд╛рде рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдЖрджрд┐ред


рдЖрдкрдХреЗ рд░реЗрдЧреЗрдХреНрд╕ рдЗрддрдиреЗ рдЦрд░рд╛рдм рдХреНрдпреЛрдВ рд╣реИрдВ?

рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдП рдЧрдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛; рдФрд░ рдпрд╣ TS рдЯреАрдо рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХрдИ рдмрд╛рд░, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреЗ рдЗрдирдкреБрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдЗрддрдирд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╛, рд╡реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИ!


рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЗ рд╕реБрдкрд░рд╕реЗрдЯ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдмреЗрд╢рдХ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ / , рд╕рд╛рде рдЕрдВрдд рдирд╣реАрдВ рд╣реИ / , рд▓рдЧрд╛рддрд╛рд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ / , рдФрд░ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ : рдкрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ " HTTP рдкрде рд░реЗрдЧреЗрдХреНрд╕"ред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд░реЗрдЧреЗрдХреНрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдиреЛрдВ рдХрд╛ рд╕реЗрдЯ рдорд╛рдиреНрдп HTTP рдкрдереЛрдВ рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреВрдЖрд░рдПрд▓ рдкрде рдкрд╛рд░реНрд╕рд░ рд╣реИ рдЬреЛ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, # рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреБрдЫ рд╡рд░реНрдг рдмрдЪ рдирд┐рдХрд▓реЗ рд╣реИрдВ, рдЖрджрд┐ред

рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рд░рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдо рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╡рд░реНрдЧ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдФрд░ рд╣рдордиреЗ рдЗрд╕реЗ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рджреМрд░рд╛рди рднреА рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛!

рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ HTTP рдкрдереЛрдВ рдореЗрдВ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рд╣реИ рдХрд┐ ? рдПрдХ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред


рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдпрд╣ рдзрд╛рдЧрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ; рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдЕрдзрд┐рдХ рджреБрд░реНрд▓рдн рд░рд╣реЗ рд╣реИрдВред рдкрд░реЗрд╢рд╛рдиреА рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реНрдг рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ - рд╡реЗ рдПрдХ RegExp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ред

рддреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдмрд╣реБрдд рд╕реЗ рд░реЗрдЧреЗрдХреНрд╕ "рдкреВрд░реНрдг" рдирд╣реАрдВ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╡реЗ рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ, рдпрд╣ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рд╡реЗ рдЕрдорд╛рдиреНрдп рдЗрдирдкреБрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?
рдЪреВрдВрдХрд┐ рд░рди-рдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдкрд╛рд░реНрд╕рд░ рдкреВрд░реНрдг рд╕рддреНрдпрд╛рдкрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдПрдХ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдЪреЗрдХ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реА рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

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


рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдФрд░ рдЪреМрд░рд╛рд╣реЗ

рд╡реИрд╕реЗ рднреА, рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реБрдкрд░ рдбреБрдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ!

рдореЗрд░рд╛ .append() рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,

append (str : (
  //Must start with forward slash
  & PatternOf</^\//>
  //Must not end with forward slash
  & PatternOf</[^/]$/>
  //Must not have consecutive forward slashes anywhere
  & not PatternOf</\/\//>
  //Must not contain colon
  & PatternOf</^[^:]+$/>
)) : SomeReturnType;

not PatternOf</\/\//> рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ,
PatternOf</^((([/])(?!\3))|[^/])+$/> рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ

рд╡реНрдпрд╛рдкрдХ рдкреНрд░рджрд░реНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП @AnyhowStep рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдЗрддрдирд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╕рд╛рдмрд┐рдд рд╣реБрдЖ!

рдореИрдВ рдЕрдХреНрд╕рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рднрд░реЗ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдПрдкрд┐рд╕ рдХреЛ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реВрдВ рдЬреЛ рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЗрди рдкреИрдЯрд░реНрди рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

// Today
function createServer(id: string, comment: string) {
  if (id.match(/^[a-z]+-[0-9]+$/)) throw new Error("Server id does not match the format");
  // work
}

// Nicer
function createServer(id: PatternOf</^[a-z]+-[0-9]+$/>, comment: string) {
  // work immediately
}

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдкреИрдЯрд░реНрди рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп string рдХрд╛рдлреА рд╣рдж рддрдХ unknown рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рд░рдирдЯрд╛рдЗрдо рдЪреЗрдХ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣реБрдд рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

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

рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЯреАрдПрд╕ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡реИрд░рд┐рдПрдбрд┐рдХ рдкреНрд░рдХрд╛рд░ # 5453 рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдлреИрд▓рд╛рддреЗ рд╕рдордп рдЕрдиреБрдорд╛рди рдЯрд╛рдЗрдк рдХрд░реЗрдВред

рднрд╡рд┐рд╖реНрдп рдХреА рдЕрдЯрдХрд▓реЗрдВ:

const x: ['a', 'b', 'c'] = [...'abc'] as const;

type T = [...'def']; // ['d', 'e', 'f'];
type Guard<T extends string> =
  [...T] extends [...'https://', ...any[]] ? Promise<any> : never;

declare function secureGET<
  T extends string
>(url: T): Guard<T>;

const x = secureGET('https://a.com');
x.then(...) // okay

const z = secureGET('http://z.com');
z.then(...); // error
type NaturalNumberString<T extends string> =
  [...T] extends ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9')[] ? T : never;

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

рдореИрдВ рдЕрднреА рднреА рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрд╛рдпрдо рд╕реНрдЯрд╛рд░-рдореБрдХреНрдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рдЖрдк рдЕрднреА рднреА рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗрдЯ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдм рддрдХ, рдореИрдВрдиреЗ рдордирдорд╛рдиреЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд╣рд▓реВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдЯреАрдПрд╕ рдЯреАрдо рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рд╣реИред

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

рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп рдбреАрдПрдлрдП рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдпреЛрдЧреНрдп рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдк/рд╕реБрдкрд░рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЗрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдЕрднреА рднреА * рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

const str : PatternOf</ab+c/> | PatternOf</ac/>

@TijmenW рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдХрд░реАрдм рд╕реЗ рдкрдврд╝реЗрдВ - рд╡рд╣рд╛рдБ рдХреБрдЫ рдЫрд┐рдкреЗ рд╣реБрдП рддрд░реНрдХ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдмрдирд╛рддреА рд╣реИрдВред рдпрд╣ рд╕реАрдзреЗ рддреМрд░ рдкрд░ рд╕реНрдЯрд╛рд░-рдореБрдХреНрдд рд╡реНрдпрд╛рдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдореЗрд░реЗ рдЕрд░реНрдз-рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдПрдХ рдЫреЛрдЯрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ starof ('a' | 'b' | ...) рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ string рдХреЗ рдмрд░рд╛рдмрд░ starof UnionOfAllCodePoints (рдпрд╣ рдЕрдм рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдПрдХ рдЖрджрд┐рдо рдмрдирд╛рдиреЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ)ред

рд╕рд╛рде рд╣реА, рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирд┐рдпрдорд┐рдд рднрд╛рд╖рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд┐рдпрдорд┐рдд рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдмрд╕реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдПрдирдкреА-рдкреВрд░реНрдг рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдмрдЧреНрд░рд╛рдл рдЖрдЗрд╕реЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ starof рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ред

TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ рдирдордХ рдХреЗ рджрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рд▓реЗрдХрд┐рди https://github.com/ostror/ts-json-validator рдЬреИрд╕реА рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд░реЗрдЧреЗрдХреНрд╕ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд▓рдХреНрд╖реНрдп рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рдкреНрд░рдХрд╛рд░/JSON рд╕реНрдХреАрдорд╛ рдЬреЛрдбрд╝реЗ <T, s> рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐

  1. рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕реЗ s рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ, T рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдмрдВрдЯрд┐рдд рд╣реИрдВ рдХрд┐ T рдЬрдм рдЦрд┐рд▓рд╛рдл рдЪрд▓рд╛рдП рд╕рддреНрдпрд╛рдкрди рдЕрд╕рдлрд▓ s ред

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

  • format
  • patternProperties
  • propertyNames

TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА рдПрдХреНрд╕реЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ A1 рдпрд╛ A5:B7 ред

рд╕рдВрдкрддреНрддрд┐ рдХреБрдВрдЬреА/рд░реЗрдЧреЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдВрдбреЗрдХреНрд╕рд░реНрд╕

рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдк рдкрд░ рдЯрд╛рдЗрдк рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо aria- рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

interface IntrinsicElements {
    // ....
    [attributeName: /aria-\w+/]: number | string | boolean;
}

рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ (рд╣рдо Regex рдЧреБрдг рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ Regex рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИ рд▓реЗрдХрд┐рди рд╡реЗрд╕реНрд▓реА рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдлреИрдмреНрд░рд┐рдХ рдореЗрдВ рдЖрддрд╛ рд░рд╣рддрд╛ рд╣реИред рдПрдХ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдШрдЯрдХ рдкреНрд░реЙрдкреНрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдКрдВрдЪрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдордд рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ data- рдФрд░ aria- рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╣рдо рдЕрдкрдиреЗ рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ

рдЕрдЧрд░ рдХреБрдЫ рд╣реИ рддреЛ рд╣рдо рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ! рдореИрдВ

рдЯреАрдПрд╕ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди :

import * as React from 'react';

// Want to reflect the same aria- and data- attributes here that JSX compiler allows in this interface:
interface TestComponentProps {
    someProp?: number;
}

const TestComponent: React.FunctionComponent<TestComponentProps> = () => {
    return null;
}

const ConsumerComponent: React.FunctionComponent = () => {
    // The React component interface allows for 'data-' and 'aria-' attributes, but we don't have any typesafe way of
    // elevating that interface or instantiating props objects that allow the same attributes. We just want to be able to 
    // define component interfaces that match what the React component interface allows without opening it up to 'any' and 
    // giving up all type safety on that interface.
    const testComponentProps: TestComponentProps = {
        someProp: 42,
        'data-attribute-allowed': 'test'
    };

    return (
        <TestComponent
            someProp={42}
            // 'data-' and 'aria-' attributes are only allowed here:
            data-attribute-allowed={'data-value'}
            aria-attribute-allowed={'aria-value'}
            {...testComponentProps}
        />
    )
}

TODO: рдХреГрдкрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдХреЗ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ рдЬреЛ RegExp рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ

рдХреНрд░реЙрди рдЬреЙрдмреНрд╕ред (рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)

^((\*|\d+((\/|\-|,){0,1}(\d+))*)\s*){6}$

рдмрд╕ рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯ рдпрд╣рд╛рдВ рдлреЗрдВрдХ рд░рд╣реЗ рд╣реИрдВ - рдореИрдВ рдПрдХ рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рдкреНрд░реЛрдк рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ HTML id рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛:

  1. рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЪрд░рд┐рддреНрд░ рд╣реЛ
  2. рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИ

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ:

interface Props {
  id: PatternOf</[^ ]+/>;
}

рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг: '<namespace>/<name>[@<version>]' . рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд╛рд▓реЗ рдЕрднрдпрд╛рд░рдгреНрдп-рдкреНрд░рдХрд╛рд░-рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛

рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рд╕реНрдЯреНрд░рд┐рдВрдЧ-рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП DOM API рдЬреИрд╕реЗ Navigator.registerProtocolHandler() ред

рдПрдордбреАрдПрди рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрддреЗ рд╣реБрдП:

рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, registerProtocolHandler() рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдХрд╕реНрдЯрдо рдпреЛрдЬрдирд╛ рддрдм рддрдХ рдкрдВрдЬреАрдХреГрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдЬрдм рддрдХ:

  • рдХрд╕реНрдЯрдо рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдо web+ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ
  • рдХрд╕реНрдЯрдо рдпреЛрдЬрдирд╛ рдХреЗ рдирд╛рдо рдореЗрдВ web+ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдмрд╛рдж рдХрдо рд╕реЗ рдХрдо 1 рдЕрдХреНрд╖рд░ рд╢рд╛рдорд┐рд▓ рд╣реИ
  • рдХрд╕реНрдЯрдо рд╕реНрдХреАрдо рдХреЗ рдирд╛рдо рдореЗрдВ рдХреЗрд╡рд▓ рд▓реЛрдЕрд░рдХреЗрд╕ ASCII рдЕрдХреНрд╖рд░ рд╣реИрдВред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, Navigator.registerProtocolHandler() рдпрд╛ рддреЛ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз string рдпрд╛ рдПрдХ рдХрд╕реНрдЯрдо string рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдХреАрдорд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред

CSSType рдХреЗ рд▓рд┐рдП CSS рдХрд╕реНрдЯрдо рдЧреБрдг -- рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдВрдж рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИред

interface Properties {
    // ....
    [customProperty: /--[a-z][^\s]*/]: number | string;
}`

рд╕рдВрдмрдВрдзрд┐рдд https://github.com/frenic/csstype/issues/63

рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╢реЛрдзрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ? https://github.com/microsoft/TypeScript/issues/7599

@ gautam1168 рдпрд╣ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдмрд╕реЗрдЯ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реИред (рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЕрдкрдиреА рдЪрд┐рдВрддрд╛рдПрдБ рд╣реИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред)

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

рдореИрдВ рдЕрднреА рднреА рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдХрд╛рдпрдо рд╕реНрдЯрд╛рд░-рдореБрдХреНрдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рдЖрдк рдЕрднреА рднреА рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗрдЯ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЕрдм рддрдХ, рдореИрдВрдиреЗ рдордирдорд╛рдиреЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд╣рд▓реВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдЯреАрдПрд╕ рдЯреАрдо рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рд╣реИред

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ,
https://github.com/microsoft/TypeScript/issues/6579#issuecomment -243338433

рдХрд┐рд╕реА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ,
https://bora.uib.no/handle/1956/3956

рд╢реАрд░реНрд╖рдХ, "рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд╡реЗрд╢рди рд╕рдорд╕реНрдпрд╛"


рддрдерд╛рдкрд┐,

  • рдпрджрд┐ рджрд╛рд╣рд┐рдиреЗ рд╣рд╛рде рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 1-рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд╣реА рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИред
  • рдЕрдиреНрдпрдерд╛, рдпрд╣ рд╕рд╣реА рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХреЛрдИ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред

https://www.sciencedirect.com/science/article/pii/S0022000011001486

(рдмреЗрд╢рдХ, рдЬреЗрдПрд╕ рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЧреИрд░-рдирд┐рдпрдорд┐рдд рд╣реИрдВ)

@AnyhowStep рдЬреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдореИрдВ рдХреЗрд╡рд▓ starof рдкреНрд░рддрд┐рдмрдВрдз рд╣рдЯрд╛ рджреВрдВрдЧрд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЙрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдмрджрд▓ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЧрдгрд┐рдд рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ (рдЙрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧ рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд╛рдХрд┐рдл рдирд╣реАрдВ рд╣реИрдВ)ред

рд╕рд╛рде рд╣реА, рдЕрд▓рдЧ рд╕реЗ, рдореИрдВ рдЙрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ starof рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ: рдХреНрдпрд╛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛/рд░реЛрдХрдирд╛ рддрдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рдпрд╣ рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрдпрд╛ рдпрд╣ рдЬреЗрдПрд╕ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдорд╛рдирдХ рдЖрд░рдИ (рдЬреИрд╕реЗ рдмреИрдХрд░реЗрдлрд░реЗрдВрд╕) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ?
рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ (рд╕рдВрдХреАрд░реНрдг):

if (Gmail.test(candidate)) {
    // candidate is also an Email
}

рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП @nikeee Decidable рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреИрдорд╛рдиреЗ рдкрд░ рджреНрд╡рд┐рдШрд╛рдд рд╕рдордп рднреА рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред рдЯреАрдПрд╕ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдХреБрдЫ рдкреГрд╖реНрдарднреВрдорд┐ рд╣реИред

рдмреИрдХрд░реЗрдлрд░реЗрдВрд╕ рдХреЗ рд╕рд╛рдордиреЗ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдШрд╛рддреАрдп рдпрджрд┐ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд░реНрдл рдПрдХ рд╢рд┐рдХреНрд╖рд┐рдд рдЕрдиреБрдорд╛рдиред

рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдЗрд╕ рдкреИрдорд╛рдиреЗ рдкрд░ рджреНрд╡рд┐рдШрд╛рдд рд╕рдордп рднреА рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рднреА рдкреВрдЫрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИред

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

@nikeee рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреА рддреБрд▓рдирд╛ рд╕рдЪрдореБрдЪ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХреА рдЬрд╛рдПрдЧреА ред рдФрд░ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдЧреБрдгреЛрдВ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдПрдХ рдЕрдиреНрдп рд░реЗрдЧреЗрдХреНрд╕рдкреА рдореИрдЪреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рдЬрд╛рдирд╡рд░ рд╣реИред

рдпрд╣ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдХрдард┐рди рд╣реИ , рдФрд░ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред (рдПрдХ рдХреЗ рд▓рд┐рдП, JS regexps рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рд╡реЗ рди рдХреЗрд╡рд▓ рдкрд░реНрдпрд╛рдкреНрдд рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рд▓рдЪреАрд▓реЗ рднреА рд╣реИрдВред)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдореИрдВ рдЯреАрдПрд╕ рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ, рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореЗрд░реЗ рдкрд╛рд╕ рд╕реАрдПрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдмрд╕ рдПрдХ рдЕрдЪреНрдЫреА рдкреГрд╖реНрдарднреВрдорд┐ рд╣реИред

рд╣рдореНрдо, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ "рд╕рд╛рдорд╛рдиреНрдп" RegEx рдХреЗ "рд╕реАрдорд┐рдд" рд╕рдмрд╕реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХреЗрдВред рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд░реЗрдЧреЗрдХреНрд╕ рдЕрдм рддрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдереЗ ... (рд░рдВрдЧ, рдлреЛрди рдирдВрдмрд░ рдЗрддреНрдпрд╛рджрд┐)

рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UX рдХреЛ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕ рдХрд╛ рдлреАрдЪрд░ рдПрдХреНрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдИ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ ... рдЗрд╕реЗ "рд░реЗрдЧреЗрдХреНрд╕" рди рдХрд╣реЗрдВ - рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЗ рд▓рд┐рдПред рд╢рд╛рдпрдж рд╕рд┐рд░реНрдл "рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди" рдпрд╛ рддреЛ: рджреЗрдЦреЗрдВ_рдиреЛ_ рдмреБрд░рд╛рдИ:ред рд▓реЗрдХрд┐рди рд╣рд╛рдБ, рд╢рд╛рдпрдж рдХреЛрдИ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ...

рдЗрд╕ рддрд░рд╣ рдПрдХ рдЧреИрд░-рд░реЗрдЧреЗрдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛:

type TLD = 'com' | 'net' | 'org';
type Domain = `${string}.${TLD}`;
type URL = `${'http'|'https'}://${Domain}`;

const good: URL = 'https://google.com'; // тЬФя╕П
const bad: URL = 'ftp://example.com'; // тЬЦя╕П TypeError: 'ftp' is not assignable to type 'http' | 'https'

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

type SubDomain = `${string}.`;
type Domain = `${SubDomain}?${string}.${TLD}`;

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
https://github.com/microsoft/TypeScript/issues/15645#issuecomment -299917814 рдФрд░ https://github.com/microsoft/TypeScript/issues/15794#issuecomment -301170109 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдРрд╕рд╛ рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдп рд╣реИ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддред
рдЕрдЧрд░ рдореИрдВ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

type TLD = 'com' | 'net' | 'org' | 'ly' | 'a' | 'b' | 'c' | 'd';
type Foo = `${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}`;
type Bar = `${Foo}${Foo}${Foo}${Foo}${Foo}`

(рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрд▓рдЧ/рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ)

рдЕрд╕реНрд╡реАрдХрд░рдг: рдореИрдВ рдЯреАрдПрд╕ рдЯреАрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдореИрдВ рдЯреАрдПрд╕ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдмрд╕ рдореЗрд░рд╛ 2c.

@rozzzly @nikeee рдХрдореЛрдмреЗрд╢ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рд╛рд░ рд╣реИ , рдмрд╕ рдХреБрдЫ рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЧрд╛рдпрдм рд╣реИрдВред рдореИрдВ рдирд┐рдпрдорд┐рдд рднрд╛рд╖рд╛рдУрдВ (рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдЕрд╡рдзрд╛рд░рдгрд╛) рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реВрдВ, рд░реЗрдЧреЗрдХреНрд╕рдкреА рдЕрдХреНрд╖рд░ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ рд▓реЗрдХрд┐рди рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдореИрде рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдк рдкреНрд░рдХрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд┐рд╕реА рдФрдкрдЪрд╛рд░рд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдпрджрд┐ рдЖрдк рдЯреАрдПрд▓рдбреА/ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рддреНрдпрдп рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рднреА рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдбреЛрдореЗрди рд╕рддреНрдпрд╛рдкрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдЪреАрдЬ рд╣реИред RFC рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрд╡рдпрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдбреЛрдореЗрди /[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)+/ + рдЬрд┐рддрдиреЗ рд╕рд░рд▓ рд╣реИрдВ, рдЕрдзрд┐рдХрддрдо 255 рд╡рд░реНрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдкреВрд░реНрдг рдирд┐рдпрдорд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд regexp рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк @rozzly рдпрд╛ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ (рдореИрдВ рдЗрд╕реЗ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛) рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА рдЬрдЯрд┐рд▓ рд╣реИред

@isiahmeadows

рдХрдореЛрдмреЗрд╢ рдпрд╣реА рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рд╛рд░ рд╣реИ , рдмрд╕ рдХреБрдЫ рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЧрд╛рдпрдм рд╣реИрдВред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рдкрдврд╝рд╛ рдерд╛ рддреЛ рдПрдХ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЕрдкрдиреЗ рдмреНрд░реЗрдХ рдкрд░ рдерд╛ рдФрд░ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рджреЗрдЦреА, @rugk рдХреА рдЯрд┐рдкреНрдкрдгреА _ "рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ ... рдЗрд╕реЗ "рд░реЗрдЧреЗрдХреНрд╕" рди рдХрд╣реЗрдВ - рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЗ рд▓рд┐рдП "_ рдЬреЛ рдореБрдЭреЗ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдерд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди _(/ рдмрд╣реБрдд рд╕рдорд╛рди) _ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд╕реНрддрд╛рд╡ рдкреЗрд╢ рдХрд┐рдпрд╛ред

... рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпрд╣ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдкреВрд░реНрдг рдирд┐рдпрдорд┐рдд рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд░реЗрдЧреЗрдХреНрд╕рдкреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк @rozzly рдпрд╛ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ (рдореИрдВ рдЗрд╕реЗ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛) рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА рдЬрдЯрд┐рд▓ рд╣реИред

рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ, рд╕реАрдорд┐рдд рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛ рдЬреИрд╕реЗ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдорддрд┐ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ _рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ-рдХрдареЛрд░ рд╕рдЦреНрдд_ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдореИрдВрдиреЗ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рд╣реИ рд╡рд╣ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЛ рдЙрдбрд╝рд╛ рдирд╣реАрдВ рджреЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ @nikeeee рдФрд░ рдЖрдк рджреЛрдиреЛрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдЦрддрд░рдирд╛рдХ рдЪрд░рдо рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдпреВрдирд┐рдпрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рднреЛрд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рдирддреЗ рд╣реБрдПред рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ @types/some-popular-project рд▓рд┐рдП рдПрдХ рдЕрдкрдбреЗрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдХреЗ рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рджрд┐рди рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:

type MixedCaseAlphaNumeric = (
    | 'a'
    | 'b'
    | 'c'
    // and so on
);

type StrWithLengthBeteen1And64<Charset extends string> = (
    | `${Charset}`
    | `${Charset}|${Charset}`
    | `${Charset}|${Charset}|${Charset}`
    // and so on
);

function updatePassword(userID: number, password: StrWithLengthBetween1And64<MixedCaseAlphaNumeric>): void {
    // ...
}

рдЗрд╕реЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЙрд╕ рд╕рдВрдШ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдЬреЛ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рдкрд░рдорд╛рдгреБрдУрдВ рд╕реЗ рдЕрдзрд┐рдХ

рдЕрдм, рдореИрдВрдиреЗ рдХреБрдЫ рднрдпрд╛рдирдХ рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрдЦреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рд▓рд┐рдП (рдЕрд╕рдВрдмрджреНрдз) рддреНрд░реБрдЯрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ ....

Type '"ЁЯШв"' is not assignable to type '"a"|"b"|"c"..........."'.ts(2322)'

рддреЛ рд╣рд╛рдБ.. рд╡рд╣рд╛рдБ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВ

@rozzly рдХреНрдпрд╛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ TupleWithLengthBeteen1And64<Charset> рд╕реЗ рдЕрд▓рдЧ (рд╡реНрдпрд╡рд╣рд╛рд░реНрдпрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдмрдирд╛рддрд╛ рд╣реИ?
рд╢рд┐рдХрд╛рдпрддрдХрд░реНрддрд╛ рдХреЛ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд░реВрдк рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдЬрд▓реНрджреА рд╕реЗ рд╡рд┐рд╕реНрдлреЛрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЗрд╕ рд╕рдордп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЕрдЧрд░ "3 рдФрд░ 1024 рдХреЗ рдмреАрдЪ рдкреВрд░реНрдгрд╛рдВрдХ" (рд╕рдВрджреЗрд╢ рдмрдлрд░ рдЖрд╡рдВрдЯрди рд▓рдВрдмрд╛рдИ рд╕реЛрдЪреЗрдВ) рдХреЛ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

@simonbuchan рдХрдо рд╕реЗ рдХрдо рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рдкреНрд░рдХрд╛рд░ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рдХрдИ рдбреЛрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрд╡рдпрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

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

рдмреИрдХрд░реЗрдлрд░реЗрдВрд╕ рдХреЗ рд╕рд╛рдордиреЗ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдШрд╛рддреАрдп рдпрджрд┐ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд░реНрдл рдПрдХ рд╢рд┐рдХреНрд╖рд┐рдд рдЕрдиреБрдорд╛рдиред

рдмреИрдХ рд░реЗрдлрд░реЗрдВрд╕ рдПрдХ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдХреЛ рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн-рдореБрдХреНрдд рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рдПрдХ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИред рдФрд░ CFG рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рд╕рдорд╛рдирддрд╛ рдЕрдирд┐рд░реНрдгреАрдд рд╣реИред рддреЛ рдпрд╣ рд╕реАрдПрд╕рдЬреА рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдмрджрддрд░ рд╣реИ, рдЬреЛ рд░реИрдЦрд┐рдХ-рдмрд╛рдзреНрдп рдСрдЯреЛрдореЗрдЯрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИрдВред


рдХреЗрд╡рд▓ рд╕рднреА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдорд╛рдирддреЗ рд╣реБрдП рдЬрд┐рдиреНрд╣реЗрдВ рдбреАрдПрдлрдП рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд░реЗрдЧреЗрдХреНрд╕рдкреА (рдХреЙрдиреИрдЯ, рдпреВрдирд┐рдпрди, рд╕реНрдЯрд╛рд░, рдЪреМрд░рд╛рд╣реЗ, рдкреВрд░рдХ рдЗрддреНрдпрд╛рджрд┐) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдХреЛ рдПрдирдПрдлрдП рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдУ (рдПрди) рд╣реИ, рджреЛ рдХрд╛ рдЙрддреНрдкрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдПрдирдПрдлрдП рдУ (рдПрдо * рдПрди) рд╣реИ, рдлрд┐рд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдЧреНрд░рд╛рдл рдХреЛ рдкрд╛рд░ рдХрд░рдирд╛ рдУ (рдПрдо * рдПрди) рд╣реИред рддреЛ, рджреЛ рдирд┐рдпрдорд┐рдд рд░реЗрдЧреЗрдХреНрд╕рдкреНрд╕ рдХреА рднрд╛рд╖рд╛ рд╕рдорд╛рдирддрд╛/рд╕рдмрд╕реЗрдЯ рдХреА рдЬрд╛рдВрдЪ рднреА рдУ (рдПрдо * рдПрди) рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдбрд╝реА рд╣реИред рдбреАрдПрдлрдП/рдПрдирдПрдлрдП/рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХреЗрдВ рдЦреБрдж рдХреЛ 1-5 рдЖрдХрд╛рд░ рдХреЗ рдЕрдХреНрд╖рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬреЗрдПрд╕ рд░реЗрдЧреЗрдХреНрд╕рдкреНрд╕ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдпреВрдирд┐рдХреЛрдб рд╣рдорд╛рд░реЗ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВред рджреА, рд╡рд┐рд░рд▓ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдЪрддреБрд░ рд╣реИрдХ рдФрд░ рд╕рдорд╛рдирддрд╛ / рд╕рдмрд╕реЗрдЯ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреНрд░рдордг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ...

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд-рд╕реЗ-рдирд┐рдпрдорд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдлрд┐рд░, рд╕рднреА рдЧреИрд░-рдирд┐рдпрдорд┐рдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╛рд╡реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░рд┐рдорд┐рдд automaton рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрднреА рднреА рддрд╛рдЬрд╝рд╛ рд╣реИ =x

рдЕрдЧрд░ рдореИрдВ рдЧрд▓рддреА рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛:

type TLD = 'com' | 'net' | 'org' | 'ly' | 'a' | 'b' | 'c' | 'd';
type Foo = `${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}${TLD}`;
type Bar = `${Foo}${Foo}${Foo}${Foo}${Foo}`

(рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдЕрд▓рдЧ/рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ)

рдордЬреЗрджрд╛рд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рд╣реИ рдЬреЛ рдирдП рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд╣реЛрдиреЗ рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

@AnyhowStep JS backreferences рдПрдХрдорд╛рддреНрд░ рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЙрддреНрдкрд╛рджрди рд╣реИрдВ (рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реАрдорд┐рдд - рдХреЗрд╡рд▓ 9 рд╕рдореВрд╣реЛрдВ рддрдХ рд╣реА рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рд╢реЗрд╖ рд░реЗрдЧреЗрдХреНрд╕рдкреА рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдорд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдпрд╣ рдирд┐рд░реНрдгрд╛рдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╢рдмреНрдж рдХреЗ рдХрд┐рд╕реА рднреА рдЕрд░реНрде рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реИред рдореИрдВ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рдЯреАрдХрддрд╛

рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рдкреБрд╖реНрдЯрд┐ @rozzly рд╕реЗ TS 4.1.0 рд░рд╛рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ!

type TLD = 'com' | 'net' | 'org';
type Domain = `${string}.${TLD}`;
type Url = `${'http'|'https'}://${Domain}`;

const success: Url = 'https://example.com';
const fail: Url = 'example.com';
const domain: Domain = 'example.com';

рдЗрд╕реЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ fail рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реИ


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

type HexChar = '0' | '1' | '2' | '3' | '4' | '5' | '6'| '7' | '8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
type HexColor = `#${HexChar}${HexChar}${HexChar}${HexChar}${HexChar}${HexChar}`;
let color: HexColor = '#123456';

рдЖрдЬ, рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред (2590)"

рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рдкреБрд╖реНрдЯрд┐ @rozzly рд╕реЗ TS 4.1.0 рд░рд╛рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ!

type TLD = 'com' | 'net' | 'org';
type Domain = `${string}.${TLD}`;
type Url = `${'http'|'https'}://${Domain}`;

const success: Url = 'https://example.com';
const fail: Url = 'example.com';
const domain: Domain = 'example.com';

рдЗрд╕реЗ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдореЗрдВ рдЖрдЬрд╝рдорд╛рдПрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ fail рдореЗрдВ рд╕рдВрдХрд▓рди рд╕рдордп рддреНрд░реБрдЯрд┐ рд╣реИ

рдпрд╣ рдбреЗрдЯрд╛-рдпрд╛ рдПрд░рд┐рдпрд╛-рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╣рдо рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдпреВрдПрдХреНрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ TS рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ | рд╕рдВрдЦреНрдпрд╛ред рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдХреНрдпрд╛ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
https://www.typescriptlang.org/play?target=99&ts=4.1.0-dev.20201001#code/LAKALgngDgpgBAEQIZicgzgCzgXjgAwBIBvAcgBMUkBaUgXxPTACcBLAOwHM78BuUDmBjMAZkgDG8AJIAVGEzjFQcFXADalVBkwAFZgHsoALmRakWALpGmbLvxB1QocfvYL0AV3GT06I3Fl5MFxFCipqISZSI1JIsHpeIA

_Update_: рдЗрд╕ рдлреАрдЪрд░ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХрдИ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣реЗрдХреНрд╕ рд░рдВрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

type HexChar = '0' | '1' | '2' | '3' | '4' | '5' | '6'| '7' | '8' | '9' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F';
type HexColor = `#${HexChar}${HexChar}${HexChar}${HexChar}${HexChar}${HexChar}`;
let color: HexColor = '#123456';

рдЖрдЬ, рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рд╕рдВрдШ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддреА рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред (2590)"

рдЬрд╛рд░реА рдиреЛрдЯреЛрдВ рдореЗрдВ рдЗрд╕ рд╕реАрдорд╛ рдХрд╛ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдерд╛ред рдпрд╣ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реИрдз рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ 16,777,216 (рдпрд╛рдиреА, 16 ^ 6) рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдШ рдмрдирд╛рдПрдЧрд╛ред

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ... Igmat рдиреЗ 2016 рдореЗрдВ рдХреБрдЫ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЬреЛ рд╡реИрд╕реЗ рднреА рдХрд╛рдЧрдЬ рдкрд░ рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рдЗрд╕рд▓рд┐рдП рдорд┐рд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдВ рд╡реИрдз рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╣реЛрдВред рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ... рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдЙрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдХреНрд╖рд░ рд╣реВрдВ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ MyUnionExtendedExoticрдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдордирдорд╛рдиреА рд░реЗрдЧреЗрдХреНрд╕ рдЯрд╛рдЗрдк рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рджрд┐рди рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░ рд╣реЛ рдЬрд╛рдКрдВ: /

рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреА рдкреБрд╖реНрдЯрд┐ @rozzly рд╕реЗ TS 4.1.0 рд░рд╛рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ!

рд╡рд╛рд╣ рд╡рд╛рд╣ред рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХреА рдереА, рдХрдо рд╕реЗ рдХрдо рдЬрд▓реНрдж рд╣реА рдирд╣реАрдВред

@chadlavi-рдХреЗрд╕рдмреБрдХ

рдЬрд╛рд░реА рдиреЛрдЯреЛрдВ рдореЗрдВ рдЗрд╕ рд╕реАрдорд╛ рдХрд╛ рдХреБрдЫ рд╕рдВрджрд░реНрдн рдерд╛ред рдпрд╣ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡реИрдз рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ 16,777,216 (рдпрд╛рдиреА, 16 ^ 6) рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдШ рдмрдирд╛рдПрдЧрд╛ред

рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдШ рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред @styfle рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ рдЫрдд рдХреЛ рд╣рд┐рдЯ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдо рдкреНрд░рджрд░реНрд╢рди рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХреБрдЫ рд╣рдж рддрдХ рдШрдЯрддреЗ рд░рд┐рдЯрд░реНрди рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

@thehappycheese

рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореЗрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреА рдЪрд╛рдмрд┐рдпрд╛рдВ рд╡реИрдз рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд╣реЛрдВ

рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдкреВрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреНрд╡рд╛рдВрдЯрд┐рдлрд╛рдпрд░ рдФрд░ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдерд╛ рддреЛ рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдмреАрдИрдПрдо рд╢реИрд▓реА рд╡рд░реНрдЧ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЬреЗрдПрд╕ рд░реЗрдЧреЗрдХреНрд╕ _too_ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИ:
^\.[a-z]([a-z0-9-]+)?(__([a-z0-9]+-?)+)?(--([a-z0-9]+-?)+){0,2}$
рдЖрдк рдПрдВрдХрд░реЛрдВ рдХреЛ рднреА рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦрдбрд╝рд╛ рд╣реИ, рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдПрдВрдб-рдЯреВ-рдПрдВрдб рдореИрдЪ рд╣реИ рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП ^ рдФрд░ $ рдирд┐рд╣рд┐рдд рд╣реИрдВред рдЕрдм рдпрд╣ рдПрдХ рд╡реИрдз рд╕реАрдПрд╕рдПрд╕ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд╕рдВрдХреАрд░реНрдг рд╕рдмрд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд░реЗрдЧреЗрдХреНрд╕ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: р▓а_р▓а рдПрдХ рдорд╛рдиреНрдп рд╡рд░реНрдЧ рдирд╛рдо рд╣реИред рдореИрдВ рдордЬрд╛рдХ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реБред

рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореБрдЭреЗ рдпрд╣ рдХрд░рдирд╛ рдерд╛ред

рдореИрдВрдиреЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирд┐рдпрдорд┐рдд рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред

рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ TS 4.1 . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрддрд╛рддреНрдордХ рдкрд░рд┐рдорд┐рдд рдСрдЯреЛрдореЗрдЯрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛

рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреАрдПрд╕ рдореЗрдВ рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреАрдПрдлрдП рдФрд░ рдкреАрдбреАрдП "рдЖрд╕рд╛рди" рд╣реИрдВред

рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд╛рд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рддреЗ рд╣реИрдВред


рдореВрд▓ рдкреНрд░рдХрд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рд╣реИрдВ рдФрд░ <30 LOC рдореЗрдВ рдлрд┐рдЯ рд╣реИрдВ,

type Head<StrT extends string> = StrT extends `${infer HeadT}${string}` ? HeadT : never;

type Tail<StrT extends string> = StrT extends `${string}${infer TailT}` ? TailT : never;

interface Dfa {
    startState : string,
    acceptStates : string,
    transitions : Record<string, Record<string, string>>,
}

type AcceptsImpl<
    DfaT extends Dfa,
    StateT extends string,
    InputT extends string
> =
    InputT extends "" ?
    (StateT extends DfaT["acceptStates"] ? true : false) :
    AcceptsImpl<
        DfaT,
        DfaT["transitions"][StateT][Head<InputT>],
        Tail<InputT>
    >;

type Accepts<DfaT extends Dfa, InputT extends string> = AcceptsImpl<DfaT, DfaT["startState"], InputT>;

рдпрд╣ рдЙрди рдСрдЯреЛрдореЗрдЯрди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреЛрдИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреАрдПрдлрдП тДв рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП


рдореИрдВ рдпрд╣ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ "рд▓рдВрдмрд╛рдИ 6 рдХреА рд╣реЗрдХреНрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ" рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗрд╡рд▓ рдмрджрд╕реВрд░рдд рд╣реИрдХрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдЧреЗрдХреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,

declare function takesOnlyHex<StrT extends string> (
    hexString : Accepts<HexStringLen6, StrT> extends true ? StrT : {__err : `${StrT} is not a hex-string of length 6`}
) : void;

//OK
takesOnlyHex("DEADBE")

//Error: Argument of type 'string' is not assignable to parameter of type '{ __err: "DEADBEEF is not a hex-string of length 6"; }'.
takesOnlyHex("DEADBEEF")

//OK
takesOnlyHex("01A34B")

//Error: Argument of type 'string' is not assignable to parameter of type '{ __err: "01AZ4B is not a hex-string of length 6"; }'.
takesOnlyHex("01AZ4B")

рдпрд╣рд╛рдБ рдПрдХ рдмреЛрдирд╕ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рд╣реИ ; рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ /^hello .*/

рдФрд░ рдПрдХ рдФрд░ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди ; рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ / world$/

рдПрдХ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг, рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди ; рдпрд╣ рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдЧреЗрдХреНрд╕ рд╣реИ !

@AnyhowStep рд╡реИрд╕реЗ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдбреАрдПрдлрдП рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реЗрдЧреЗрдХреНрд╕ [abc]{4} рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рд▓рд╛рдкрддрд╛ рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ 4 рдХреА рд▓рдВрдмрд╛рдИ (рдЖрдЖ, рдПрдмреАрд╕реА, рдмреАрдмреАрд╕реАрд╕реА, рдЖрджрд┐ ...) рдХреЗ рд╕рд╛рдеред
рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

https://cyberzhg.github.io/toolbox/min_dfa?regex=ZCgoYmQqYiopKmMpKg==

https://github.com/CyberZHG/toolbox

рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рдЗрдЪреНрдЫрд╛рд╢рдХреНрддрд┐ рд╣реЛрддреА, рддреЛ рдореИрдВ рдКрдкрд░ рдХреА рддрд░рд╣ рдХреБрдЫ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рдФрд░ рд░реЗрдЧреЗрдХреНрд╕ рдХреЛ рдЯреАрдПрд╕ рдбреАрдПрдлрдП тДв рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдПрдХ рд╕рд╛рде рдлреЗрдВрдХрд╛ рд╣реИ,

https://glitch.com/~sassy-valiant-heath

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ] https://glitch.com/~efficcious-valley-repair <- рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░реЗрдЧреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИ

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ] рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд▓рд┐рдЪ рдЙрди рдореБрдХреНрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВред рддреЛ, рдпрд╣рд╛рдБ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ git рд░реЗрдкреЛ рд╣реИ,
https://github.com/AnyhowStep/efficcious-valley-repair/tree/main/app

рдЪрд░рдг 1, рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рд░реЗрдЧреЗрдХреНрд╕ рдореЗрдВ рдХреБрдВрдЬреА,
image

рдЪрд░рдг 2, рдХрдиреНрд╡рд░реНрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ,
image

рдЪрд░рдг 3, рдЙрддреНрдкрдиреНрди TS рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди URL рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ,
image

рдЪрд░рдг 4, рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ InLanguage_0 ,
image

рдЪрд░рдг 5, рдЗрдирдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓реЗрдВ,
image

image

рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рднрд╛рд░реА рднрд╛рд░реЛрддреНрддреЛрд▓рди рдХреЗ рд▓рд┐рдП, https://www.npmjs.com/package/regex2dfa рдХреЗ рд▓реЗрдЦрдХ @kpdyer рдХреЛ

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЯреНрдпреВрд░рд┐рдВрдЧ рдорд╢реАрди рд╣реИ

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди

рдпрд╣ рдзрд╛рдЧрд╛ рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдпрд╛ рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рд╖рдп рд╕реЗ рдкрд░реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдЕрдВрдХ #41160 рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рджреНрд╡рд╛рд░рд╛ рдХреМрди рд╕реЗ рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдкрд╛рд░реНрд╕рд░реНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ

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