LuaLS / LuaLS/lua-language-server
Best way to implement something like an abstract base class?
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Lua
- Estrellas
- 4.4k
- Forks
- 442
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
I'm working on a framework where users of it implement a kind of module that mixes their provided logic with some optional event handlers.
Here is a simple example
-- provided by framework
---@class Base
---@field OnClick fun(self: Base, x: number, y: number)
local base = {}
---@generic T: Base
---@param name `T`
---@return T
function New(name)
return setmetatable({}, {__index = base})
end
-- usage of framework by user
---@class MyImpl: Base
local foo = New("MyImpl")
function foo:OnClick(x, y) -- x and y are inferred as any instead of number :(
end
function foo:myHelperFunction()
end
So I expect the user to implement OnClick and fill it with their logic. My goal here is that the user automatically gets the correct types on the parameters for foo:OnClick. Here in this simple example it's just two numbers, but my real app has like > 10 such methods and some of these take complex types as parameters.
With the code above it doesn't know anything about the parameters in OnClick and shows them as any. Maybe I got something wrong with the generics, but even without all the fancy generic stuff (just @return base on New) it's the same problem.
The only work-around I found was to not use @class on the user-defined class and not define a generic, this makes the parameters on the OnCLick function definition correct! However, it now triggers injected-field on all user-defined values not defined in the base class like the myHelperFunction method :(
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Reproducir el ejemplo anotado de Lua del issue #2453 e inspeccionar cómo gestiona el servidor de lenguaje los retornos genéricos, los métodos heredados y los campos añadidos por el usuario. Se considera terminado cuando los parámetros sobrescritos de OnClick se infieren como number, mientras que los métodos definidos por el usuario, como myHelperFunction, no producen diagnósticos de campos inyectados.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- lua
- Área
- developer-experience, devtools
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 30/100