Как стать автором
Обновить

Комментарии 11

Ну вот… я ожидал, что появился способ заставить сам рантайм проверять типы (видимо исполняя Тайпскрипт без компиляции?), а тут про декораторы )) Но за статью все равно спасибо – в ней много полезной информации. Хотя я бы ещё добавил что-нибудь про type guards – мне кажется, они были бы тут в тему.

Особенно интересной оказалась информация, что Клауса Вирта не существовало, а Паскаль придумал сразу Андерс Хейлсберг :-)
"Карл Маркс и Фридрих Энгельс это не муж и жена, а четыре разных человека."
Согласно вики, Андерс Хейлсберг (дат. Anders Hejlsberg; род. 2 декабря 1960, Копенгаген)[2] — датский инженер-программист. Создатель Turbo Pascal, Delphi, C# и TypeScript.

Так что скорее всего я не ошибся, просто не указал 100% фактов, так как цели этой и не ставил,

Конечно, я мог допустить неточности. Буду признателен, если вы в конструктиве допишете в коментах достоверные факты.
Ну, тут вы уже сами видите неточность (Турбо Паскаль – это всё-таки не Паскаль вообще, а вполне конкретная среда… да, гениальная, да, очень сильно повлиявшая на индустрию – но Паскаль придумал совсем другой человек).

Это просто неаккуратность, не осуждаю (тем паче вы, вероятно, в курсе, кто придумал Pascal) – но она лишний раз напоминает, насколько критически надо воспринимать статьи в сети. Автор может ошибиться по незнанию, может исказить факты случайно, может даже намеренно исказить информацию. Всё надо перепроверять.

ЗЫ: А вот за «скорее всего я не ошибся, просто не указал 100% фактов» – осуждаю. Тут была не неполная информация, а именно неверная.
спасибо! очень важен отклик.
Доступ к полям объекта по имени (obj['prop'])

noImplicitAny = true
suppressImplicitAnyIndexErrors = false


а текущие аргументы мы можем получить классическим для JS способом — через переменную arguments

rest parameters


каждый из параметров в возвращаемом значении Reflect.getMetadata будет по сути функцией

Это касается лишь примитивов и классов. При этом статически параметры теряются. А для всех остальных типов выдаётся просто Object. Это сводит всю это затею на нет.

Да, к сожалению этот способ не решает полностью проблемы. И проверить все нельзя, и типы в массивах не проверишь (там просто нет метаданных), и много чего еще. Это не решение всего, скорее исследование что вообще можно сделать простыми средствами.

Насчет 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 ) )

То же саме в плейграунде.

отлично! напоминает IO-TS Runtime; посмотрю на досуге!
Сам не пишу на TypeScript, потому при прочтении не слишком осознал проблему, вроде же на каждом углу трубят что TS = строго типизированный JS.
Но недавно вышла статья: Объясните мне, как вы для себя разобрались в моделях типизаций — они же все размыты.
Вернулся сюда, перечитал, теперь понял. Будем знать, спасибо!
Вдруг кому тоже пригодится.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Публикации

Истории