Использование Свойств Частного Класса Для Улучшения Набора Текста В Машинописном Тексте

Вот за что я люблю машинописный текст, потому что он не позволяет мне чушь пороть.

Измерить длину числового значения и т. д. Сначала я, конечно, плюнул, возмутился, что ко мне приставают со всякими дурацкими формальностями.

Но потом я втянулся и влюбился сильнее.

Ну, в смысле чуть-чуть строже.

Я включил в проекте опцию strictNullChecks и потратил три дня на исправление возникших ошибок.

А потом с удовлетворением обрадовался, отметив, насколько легким и непринужденным стал рефакторинг.

Но тогда вам хочется чего-то еще большего.

И здесь вам нужно объяснить машинописцу, какие ограничения вы на себя накладываете, и делегировать ему обязанность следить за соблюдением этих ограничений.

Давай, сломай меня полностью.



Пример 1

Некоторое время назад меня увлекла идея использовать React в качестве шаблонизатора на сервере.

Конечно, меня заворожила возможность печатать.

Да там всякие мопсы, усы и еще много чего.

Но самому разработчику приходится иметь в виду, не забыл ли он расширить переданный в шаблон аргумент новыми полями.

(Если это не так, поправьте меня.

Но в целом мне все равно — слава богу, мне по роду деятельности не приходится генерировать шаблоны.

И пример о другом).

И здесь мы можем нормально набирать реквизиты, передаваемые компоненту, и получать соответствующие подсказки IDE при редактировании шаблона.

Но это внутри компонента.

Теперь проверим, что мы не передали в этот компонент никакой леворукости.

  
  
  
   

import { createElement, FunctionComponent, ComponentClass } from 'react'; import { renderToStaticMarkup } from 'react-dom/server'; export class Rendered<P> extends String { constructor(component: FunctionComponent<P> | ComponentClass<P>, props: P) { super('<!DOCTYPE html>' + renderToStaticMarkup( createElement(component, props), )); } }

Теперь если мы попытаемся передать реквизиты из заказа в пользовательский компонент, нам сразу укажут на это недоразумение.

Прохладный? Прохладный.

Но это во время генерации html. Как обстоят дела с его дальнейшим использованием? Потому что результат установки Рендеринг это просто строка, то машинописный текст не будет жаловаться, например, на такую конструкцию:

const html: Rendered<SomeProps> = 'Typescript cannot into space';

Соответственно, если мы напишем что-то вроде этого контроллера:

@Get() public index(): Rendered<IHelloWorld> { return new Rendered(HelloWorldComponent, helloWorldProps); }

это никак не гарантирует, что из этого метода будет возвращен именно результат компиляции компонента HelloWorldКомпонент .

Что ж, давайте сделаем это не просто строкой :)

export class Rendered<P> extends String {

Теги: #JavaScript #node.js #typescript #печатать

Вместе с данным постом часто просматривают: