Когда я начинал писать заметку «Типы, где их не ждали», мне казалось, что я осилил принести эрланговские типы в рантайм и теперь могу их использовать в клиентском коде на эликсире. Ха-ха, как же я был наивен.
Все, что предложено по ссылке, будет работать для явных определений типа по месту использования, наподобие use Foo, var: type()
. К сожалению, такой подход обречен, если мы хотим определить типы где-нибудь в другом месте: рядом в коде при помощи атрибутов модуля, или, там, в конфиге. Например, для определения структуры мы можем захотеть написать что-то типа такого:
# @fields [foo: 42]
# defstruct @fields
@definition var: atom()
use Foo, @definition
Код выше не то, что не обработает тип так, как нам хочется — он не соберется вовсе, потому что @definition var: atom()
выбросит исключение ** (CompileError) undefined function atom/0
.