Перейти к содержимому
Exeteres

TypeScript to Lua

Рекомендуемые сообщения

В 07.01.2020 в 18:34, hohserg сказал:

Запускаю таску watch, транслированный файл появляется(чекнул через проводник), но в VSCode не отображается, таска watch не завершается 

image.png.c1821530cee3f59fa9c62f8cb5e9dabf.png

 

image.png.c50dc763166e3e003efa41785b2fea91.png

Watch и не должен завершаться. Он будет смотреть за изменением исходных файлов и компилировать их.

 

Попробуй нажать кнопку обновить вверху панели с файлами. VSCode пока не может следить за изменениями по ссылкам.

image.png.7444ee1998cd3d4f2e8d14bc17b712be.png

Изменено пользователем Exeteres

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Осваиваю TypeScript. Возник такой вопрос: может ли транслятор сгенерировать декларации(definitions) для файлов, которые че-то экспортируют, т.е. являются библиотеками? Например, если я написал библиотеку, опубликовал, то было бы удобно распространять .d.ts-файлы для нее

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, hohserg сказал:

Осваиваю TypeScript. Возник такой вопрос: может ли транслятор сгенерировать декларации(definitions) для файлов, которые че-то экспортируют, т.е. являются библиотеками? Например, если я написал библиотеку, опубликовал, то было бы удобно распространять .d.ts-файлы для нее

 

Да, это возможно с помощью флага declaration в compilerOptions файла tsconfig.json.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

OC-TS: Init не добавляет в воркспейс декларации https://github.com/Exeteres/opc-types

Это баг или нужно отдельно ставить?

 

image.png.7503ef0cb3e89130dcfeceb0e5d79eb6.png В ide типы не появились даже когда установил вручную

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
10 часов назад, hohserg сказал:

OC-TS: Init не добавляет в воркспейс декларации https://github.com/Exeteres/opc-types

Это баг или нужно отдельно ставить? 

  

image.png.7503ef0cb3e89130dcfeceb0e5d79eb6.png В ide типы не появились даже когда установил вручную

Должен был установиться вместе с typescript-to-lua, проверь нет ли ошибок при выполнении команды. (у меня на Windows 10 все ок)

 

require пока не типизирован, но его тоже можно расширить, если это будет нужно.

Для импорта в тайпскрипте используются следующие конструкции:

Скрытый текст

1. Импорт всего содержимого модуля (аналог require)

image.png.dde6379bc8ab82fea97f5a1966c8e018.png

 

2. Импорт отдельных функций, методов и тд

image.png.b114cd4da22a6f15f30252bf87086e62.png

 

Изменено пользователем Exeteres

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как получить rest args модуля или аргументы запуска программы?

--lua
print(select(2, ...))
local rest_args={...}
print(rest_args)

Какой TS-эквивалент у кода выше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
20 минут назад, hohserg сказал:

Как получить rest args модуля или аргументы запуска программы?


--lua
print(select(2, ...))
local rest_args={...}
print(rest_args)

Какой TS-эквивалент у кода выше?

image.png.ab1a01e6e06d23174365f41d68c3c12f.png

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А что с функциям, которые возвращают много значений? Например, component#list типизирован как просто функция.

let list=component.list(filter)
let [address,name]=list()
local list = component.list(filter)
local address, name = unpack(
    list(nil)
)

Чтобы исправить это приходится костылить:

declare module table {function pack(this: void, ...args:any[]): Array<any>;}

let list=component.list(filter)
let [address,name]=table.pack(list())
local list = component.list(filter)
local address, name = unpack(
    table.pack(
        list(nil)
    )
)

Как по-нормальному работать с такими функциями?

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@hohserg Это недоработка в декларациях. Я могу ее исправить, но мне нужно понять почему там возвращается функция (Я копировал эти типы из документации). Это какой-то итератор? Или это все-таки таблица?

Изменено пользователем Exeteres

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это таблица, которая имеет метатаблицу, благодаря которой появляется функция итератора.

Т.е. надо как-то типизировать метатаблицы у таблиц

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, hohserg сказал:

Это таблица, которая имеет метатаблицу, благодаря которой появляется функция итератора.

Т.е. надо как-то типизировать метатаблицы у таблиц 

Ага, вижу. Это не сложно типизировать, сейчас исправлю.

image.png.0b8014d73f157ec4a9d7106c3f25b7b5.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@hohserg Исправил в новой версии @opct/openos 0.0.8

component.list() теперь исправно работает как генератор.

image.png.4be40e0800e7c16afbd2adad8b245ffd.png

 

Аргументы командной строки можно получить из глобальной переменной args.

image.png.c680796cd75a5e3a7ec54551e3c54fc8.png

 

Кстати, рекомендую изучить эту страницу, чтобы избежать возможных проблем совместимости Lua с TypeScript функциями.

Позже я опишу этот нюанс и нововведения в гайде.

Изменено пользователем Exeteres

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В lua часто используются таблицы вроде

local set1={
  some=true,
  ["key"]=true,
}
local set2={
  anyValue=otherAnyValue
}

По смыслу им эквивалентны Set<string> или Map<string,boolean> и Map<any,any>, но фактические значения, пришедшие из внешнего lua-кода ими не являются. Как их типизировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@hohserg Похоже, что TypeScript не позволяет использовать в качестве ключа типы отличные от string и number. Я попробую спросить что с этим можно сделать у разработчиков транспилера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну допустим даже в пределах string и number. Нужен какой-то тип, который позволяет получить значение any по ключу. Насколько я понимаю, для своего типа нельзя переопределить оператор []. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 13.01.2020 в 21:45, hohserg сказал:

Ну допустим даже в пределах string и number. Нужен какой-то тип, который позволяет получить значение any по ключу. Насколько я понимаю, для своего типа нельзя переопределить оператор []. 

Разрабы из дискорда действительно помогли.

Надо использовать директиву @luaTable. Не сильно красивое решение (в плане создания таблицы, ведь надо приводить ее к any, т.к. у нее нет этих методов), зато лучше чем полное отсутствие типизации.

Скрытый текст

image.png.7064642e5d5d83863cc1df1c095e38b6.png

 

Транспилируется в

image.png.ed69a3f11882b92a472ff7561585bb27.png

 

Изменено пользователем Exeteres

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть готовый класс https://github.com/TypeScriptToLua/TypeScriptToLua/blob/master/src/lualib/declarations/luatable.d.ts

И его вроде нужно юзать так ```LuaTable<{},any>```

Только никак не пойму: как его импортировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
29 минут назад, hohserg сказал:

Есть готовый класс https://github.com/TypeScriptToLua/TypeScriptToLua/blob/master/src/lualib/declarations/luatable.d.ts

И его вроде нужно юзать так ```LuaTable<{},any>```

Только никак не пойму: как его импортировать? 

Скорее всего он не включен в состав npm пакета.

Я могу лишь добавить его к тайпингам opencomputers, хотя это и не логично.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Было бы кстати. Такой тип ведь не создает дополнительные инструкции

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...