>> Вывод типов в дженериках
Немного дополню. Иногда вывод типа нужно сделать для экземпляров некоторого класса, например:
class User {
constructor(readonly lastName: string, readonly firstName: string) {}
}
// Хочется, чтобы IVANOV имел строго то, что написано в конструкторе (lastName - "Иванов", firstName - "Иван")
const IVANOV = new User("Иванов", "Иван");
// Вывод типа >> const IVANOV: User
// Не заработает const IVANOV = new User("Иванов" as const, "Иван" as const);
На помощь приходит простое решение, но почему-то про него забывают
// Тогда конструкции нужно видоизменить. Декларация конечно монстр
class User2<LN extends string, FN extends string> {
constructor(readonly lastName: LN, readonly firstName: FN) {}
}
const IVANOV2 = new User2("Иванов", "Иван");
// Вывод типа >> const IVANOV2: User2<"Иванов", "Иван">
Если кто подскажет как сделать такое без дженериков буду признателен
А что думаете по поводу шаблонных языков в качестве фильтров для поиска и решения Вашей проблемы? Для указанных в статье данных это могло бы выглядеть так:
// Человеко читаемый фильтр по пользователям
const usersFilter = `$age == 23 AND $name CONTAINS 'mary'`;
const filteredUsers = yourLib.filter(users, usersFilter);
// Человеко читаемый фильтр по группам
const groupFilter = "$list.name CONTAINS 'Li' OR $groups.groups.list.name CONTAINS 'Li'";
const filteredGroups = yourLib.filter(groups, groupFilter);
// Можно заменить константы, например, через template строку
const userFilters2 = `$age == ${filterValue.age} AND $name CONTAINS '${filterValue.searchText}'`;
Мастером коммуникации на мой взгляд можно стать в 2 случаях:
1) У Вас талант от природы к коммуникациям и вы его развиваете (явно не про интроверта)
2) У Вас неотложные обстоятельства требующие быть мастером, например, должность президента при наличие внутренней мотивации к изменениям (интроверт? — мало вероятно)
Все остальное — это подорожание и издевательство над собой: Вы ведь другой — тихая гавань снаружи и безграничная фантазия внутри)
Очень странно, что пункт Узнавайте себя стоит на 6 месте, почему не на первом???
Если честно, немного не понятно, зачем плодить модульные broadcast и сами $module, когда можно общаться через единую шину (в примере $rootBroadcast) с помощью сообщений, одним из обязательных параметров которого будет имя модуля. причем, если нет желание писать имя модуля в событии явно, его также можно задекларировать в прототипе вуя как $moduleName. Наличие класса типа ModuleEvent даст возможность понимать где какие события отсылаются/обрабатываются. Это может быть полезным при погружении и фикса багов.
Вы бросили достойный вызов легаси. Могу пожелать терпения и удачи.
В рамках эксперимента, нашей команде была поставлена обратная задача — запустить java(апплет) приложение в браузере (разумеется никак апплет, а как js приложение. В апплете более 5тыс классов, свой LookAndFeel, Swing и прочие вещи. В это трудно поверить, но с помощью CheerpJ и 2 напильников нам удалось за 2 дня достичь успеха в этом деле.
По проделанной Вами работы, хочется понять в целом — это разумно js под граалем запускать?
волшебная кнопка
А можно узнать сколько стоит эта волшебная кнопка? Есть ли триал версия и остальную важную информацию о продукте?
Например, решения оффлайн/облако(как сервис)
Спасибо, действительно хорошее дополнение для статьи. В продолжение — попробовал добавить тип, который допускает передачу только объектов того же типа.
type OneField = {
id: string;
}
type TwoField = {
id: string;
data?: string;
}
type DiffType<Free, Strong> = Omit<Free, keyof Strong>
type Constraint<Free, Strong> = Record<keyof DiffType<Free, Strong>, never>
type DirectType<Free, Strong> = Free & Constraint<Free, Strong>
function validate<Free>(data: DirectType<Free, OneField>) {
// do some work
}
const okData: OneField = null;
const badData: TwoField = null;
validate(okData);
validate(badData); // Ошибка!!!
В 2017 году мне тоже был интересен этот вопрос, тогда я решил задачу в лоб с помощью кодогенерации и проверил эмпирически для java7. Статья на хабре здесь — ответ в секции Эксперимент. У меня получилось
столько
2746
Убрал под спойлер из уважения к автору этой статьи, так как он обещает продолжение
Из интересного, на мой взгляд, можно отметить еще и шаблоны (дженерики)
public class Records {
public static void main(String[] args) {
new Point<Integer>(1, 2).print();
new Point<String>("11", 2).print();
}
}
record Point<T>(T x, int y) {
void print() {
System.out.println("" + x + " - " + y);
}
}
Немного дополню. Иногда вывод типа нужно сделать для экземпляров некоторого класса, например:
На помощь приходит простое решение, но почему-то про него забывают
Если кто подскажет как сделать такое без дженериков буду признателен
Мастером коммуникации на мой взгляд можно стать в 2 случаях:
1) У Вас талант от природы к коммуникациям и вы его развиваете (явно не про интроверта)
2) У Вас неотложные обстоятельства требующие быть мастером, например, должность президента при наличие внутренней мотивации к изменениям (интроверт? — мало вероятно)
Все остальное — это подорожание и издевательство над собой: Вы ведь другой — тихая гавань снаружи и безграничная фантазия внутри)
Очень странно, что пункт Узнавайте себя стоит на 6 месте, почему не на первом???
Зачем вообще ставить задачу на функциональность, которая не нужна?
К сожалению, не все это понимают, для многих стоп-фактором может быть сущий пустяк.
Мне кажется это самый важный пункт из статьи, если не в ущерб качеству. И чем быстрее будет получен ответ тем лучше.
Если честно, немного не понятно, зачем плодить модульные broadcast и сами $module, когда можно общаться через единую шину (в примере $rootBroadcast) с помощью сообщений, одним из обязательных параметров которого будет имя модуля. причем, если нет желание писать имя модуля в событии явно, его также можно задекларировать в прототипе вуя как $moduleName. Наличие класса типа ModuleEvent даст возможность понимать где какие события отсылаются/обрабатываются. Это может быть полезным при погружении и фикса багов.
Вы бросили достойный вызов легаси. Могу пожелать терпения и удачи.
В рамках эксперимента, нашей команде была поставлена обратная задача — запустить java(апплет) приложение в браузере (разумеется никак апплет, а как js приложение. В апплете более 5тыс классов, свой LookAndFeel, Swing и прочие вещи. В это трудно поверить, но с помощью CheerpJ и 2 напильников нам удалось за 2 дня достичь успеха в этом деле.
По проделанной Вами работы, хочется понять в целом — это разумно js под граалем запускать?
волшебная кнопка
А можно узнать сколько стоит эта волшебная кнопка? Есть ли триал версия и остальную важную информацию о продукте?
Например, решения оффлайн/облако(как сервис)
Отвечу за автора — да стоит и всем советую.
К сожалению, я не нашел способа запретить указание дженерика
Убрал под спойлер из уважения к автору этой статьи, так как он обещает продолжение
Если кто не видел сюда про 52!
Где VersionSpecific — это интерфейс