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