LuaLS / LuaLS/lua-language-server
Feature Request: Assertion Functions
Personne n'a encore pris cette issue.
- Langage dominant
- Lua
- Étoiles
- 4.4k
- Forks
- 442
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
I would like annotation and type checking that supports and implements TypeScript's "Assertion Functions":
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#assertion-functions
It's similar to other open feature requests for type predicates / narrowing except it avoids the need for if statements and to return a boolean from the function where true means a variable is of a given type and false if it's not that type.
I mentioned this briefly in another open issue but the original issue was for implementing narrowing/type predicates:
https://github.com/LuaLS/lua-language-server/issues/704#issuecomment-1484060572
This TypeScript code illustrates the feature:
function assertIsString(val: any): asserts val is string {
if (typeof val !== "string") {
throw new AssertionError("Not a string!");
}
}
This tells the linter that the argument passed to the val parameter is a string if no assertion raised an error.
In Lua, this might look like the following:
---@param val any
---@asserts val is string
local function assertIsString(val)
assert(type(val) == "string", "Not a string!")
end
---@param str any
local function yell(str)
assertIsString(str)
-- No error was thrown! Therefore, the next line should not be marked as a warning and `str` must be a string.
return str:upper()
end
The problem at the moment is that I need to add ---@cast val string after every usage of assertIsString:
local function yell(str)
assertIsString(str)
---@cast str string
return str:upper() -- LuaLS complains that str might not be a string unless I cast it
end
There is no other way of telling LuaLS that the result has been confirmed to be a string unless the assert expression is directly in the same body of code.
I would suggest adding narrowing with type predicates first as this feature request seems like the next feature on top of that feature, but I'd like to see what people think :)
Thank you!
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par lire la référence de TypeScript 3.7 sur les fonctions d’assertion et l’issue 704 liée sur les prédicats de type, puis examinez comment les annotations @cast existantes effectuent le narrowing. La tâche est terminée lorsqu’une annotation d’assertion Lua peut restreindre l’argument après un appel d’assertion réussi, afin que l’exemple yell accepte str:upper() sans cast séparé.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- lua, typescript
- Domaine
- tooling
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 30/100