Комментарии 11
Ну вот… я ожидал, что появился способ заставить сам рантайм проверять типы (видимо исполняя Тайпскрипт без компиляции?), а тут про декораторы )) Но за статью все равно спасибо – в ней много полезной информации. Хотя я бы ещё добавил что-нибудь про type guards – мне кажется, они были бы тут в тему.
Особенно интересной оказалась информация, что Клауса Вирта не существовало, а Паскаль придумал сразу Андерс Хейлсберг :-)
"Карл Маркс и Фридрих Энгельс это не муж и жена, а четыре разных человека."
Согласно вики, Андерс Хейлсберг (дат. Anders Hejlsberg; род. 2 декабря 1960, Копенгаген)[2] — датский инженер-программист. Создатель Turbo Pascal, Delphi, C# и TypeScript.
Так что скорее всего я не ошибся, просто не указал 100% фактов, так как цели этой и не ставил,
Конечно, я мог допустить неточности. Буду признателен, если вы в конструктиве допишете в коментах достоверные факты.
Так что скорее всего я не ошибся, просто не указал 100% фактов, так как цели этой и не ставил,
Конечно, я мог допустить неточности. Буду признателен, если вы в конструктиве допишете в коментах достоверные факты.
Ну, тут вы уже сами видите неточность (Турбо Паскаль – это всё-таки не Паскаль вообще, а вполне конкретная среда… да, гениальная, да, очень сильно повлиявшая на индустрию – но Паскаль придумал совсем другой человек).
Это просто неаккуратность, не осуждаю (тем паче вы, вероятно, в курсе, кто придумал Pascal) – но она лишний раз напоминает, насколько критически надо воспринимать статьи в сети. Автор может ошибиться по незнанию, может исказить факты случайно, может даже намеренно исказить информацию. Всё надо перепроверять.
ЗЫ: А вот за «скорее всего я не ошибся, просто не указал 100% фактов» – осуждаю. Тут была не неполная информация, а именно неверная.
Это просто неаккуратность, не осуждаю (тем паче вы, вероятно, в курсе, кто придумал Pascal) – но она лишний раз напоминает, насколько критически надо воспринимать статьи в сети. Автор может ошибиться по незнанию, может исказить факты случайно, может даже намеренно исказить информацию. Всё надо перепроверять.
ЗЫ: А вот за «скорее всего я не ошибся, просто не указал 100% фактов» – осуждаю. Тут была не неполная информация, а именно неверная.
спасибо! очень важен отклик.
Доступ к полям объекта по имени (obj['prop'])
noImplicitAny = true
suppressImplicitAnyIndexErrors = false
а текущие аргументы мы можем получить классическим для JS способом — через переменную arguments
rest parameters
каждый из параметров в возвращаемом значении Reflect.getMetadata будет по сути функцией
Это касается лишь примитивов и классов. При этом статически параметры теряются. А для всех остальных типов выдаётся просто Object. Это сводит всю это затею на нет.
Да, к сожалению этот способ не решает полностью проблемы. И проверить все нельзя, и типы в массивах не проверишь (там просто нет метаданных), и много чего еще. Это не решение всего, скорее исследование что вообще можно сделать простыми средствами.
Насчет noImplicitAny — да, однозначно. Вот только — часто вы видели такое? куча библиотек используют any и выдают их в качестве результата. а иногда я вообще вижу конструкции типа: smth as any as unknown.
Насчет noImplicitAny — да, однозначно. Вот только — часто вы видели такое? куча библиотек используют any и выдают их в качестве результата. а иногда я вообще вижу конструкции типа: smth as any as unknown.
Ну и не могу не порекомендовать свой велосипед — $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 ) )
Сам не пишу на TypeScript, потому при прочтении не слишком осознал проблему, вроде же на каждом углу трубят что TS = строго типизированный JS.
Но недавно вышла статья: Объясните мне, как вы для себя разобрались в моделях типизаций — они же все размыты.
Вернулся сюда, перечитал, теперь понял. Будем знать, спасибо!
Вдруг кому тоже пригодится.
Но недавно вышла статья: Объясните мне, как вы для себя разобрались в моделях типизаций — они же все размыты.
Вернулся сюда, перечитал, теперь понял. Будем знать, спасибо!
Вдруг кому тоже пригодится.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Runtime Type Safety in Typescript (Возможна ли удобная проверка типов в рантайме)