как создать тип Luau, содержащий ключ, который требует цитирования?

#lua #roblox

Вопрос:

Я хотел бы иметь возможность создать тип, в котором есть недопустимые символы поля. С помощью стола я могу сделать это:

 local Element = {
  ["$typeof"] = 31337,
}
 

с типами Roblox Luau я не могу этого сделать:

 type Element = {
  ["$typeof"]: number,
}
 

Как я могу строго ввести это поле в моей таблице элементов, не прибегая к использованию any ?

Ответ №1:

Вы можете сделать это с помощью typeof оператора и --!strict прагмы:

Элемент.lua

 --!strict

local Element = {
  ["$typeof"] = 0,
  render = function(x, y) end :: (x: number, y: string?): ()
}
export type Element = typeof(Element)
 

Обратите внимание, что:

  1. файл, экспортирующий этот тип, должен быть в строгом режиме, чтобы при возврате typeof сохранялись типы высокой точности.
  2. Исходный файл, для которого требуется Element.lua, не обязательно должен быть включен в строгом режиме, но все равно неплохо работать в строгом режиме, когда это возможно.
  3. Возможно, вам не придется использовать синтаксис проверки типа ( :: ), в зависимости от того, какие у вас назначения таблиц.