Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Ну вот… я ожидал, что появился способ заставить сам рантайм проверять типы (видимо исполняя Тайпскрипт без компиляции?), а тут про декораторы )) Но за статью все равно спасибо – в ней много полезной информации. Хотя я бы ещё добавил что-нибудь про type guards – мне кажется, они были бы тут в тему.
"Карл Маркс и Фридрих Энгельс это не муж и жена, а четыре разных человека."
Доступ к полям объекта по имени (obj['prop'])
noImplicitAny = true
suppressImplicitAnyIndexErrors = false
а текущие аргументы мы можем получить классическим для JS способом — через переменную arguments
rest parameters
каждый из параметров в возвращаемом значении Reflect.getMetadata будет по сути функцией
Это касается лишь примитивов и классов. При этом статически параметры теряются. А для всех остальных типов выдаётся просто Object. Это сводит всю это затею на нет.
Ну и не могу не порекомендовать свой велосипед — $mol_data:
import {
$mol_data_string as Str,
$mol_data_integer as Int,
$mol_data_record as Rec,
$mol_data_optional as Maybe,
$mol_data_variant as Vary,
$mol_data_email as Mail,
$mol_data_pipe as Pipe
} from "mol_data_all";
class MyDate {
constructor(value: string) { }
year!: number
month!: number
day!: number
}
const UserDTO = Rec({
name : Str ,
age : Maybe( Int ) ,
birthday : Pipe( Str , MyDate ) ,
phone : Vary( Str , Int ) ,
mail : Mail ,
})
// Ensure this is a User
const jin = UserDTO({
name : 'Jin' ,
age : 33 ,
birthday : '1984-08-04' ,
phone : 791234567890,
mail : 'foo@example.org' ,
})
// typeof jin === {
// readonly name: string;
// readonly age?: number | undefined;
// readonly birthday: Moment;
// readonly phone?: string | number;
// readonly mail: string;
// }
// Allow only Users
function printName( user : typeof UserDTO.Value ) {
console.log( user.name )
}
printName( jin )
// Wrong json from server
const json = {
name : 'Jin' ,
age : 33 ,
birthday : '1984-08-04' ,
phone : 791234567890,
mail : '</script>' ,
} as any
// Runtime error: ["mail"] </script> is not a /.+@.+/
printName( UserDTO( json ) )
Runtime Type Safety in Typescript (Возможна ли удобная проверка типов в рантайме)