父类的方法签名是不是都要使用@generic才能确保子类调用父类方法时能够返回子类型?但是这样又会失去父类型提示 #2640
Unanswered
xiangnanscu
asked this question in
Q&A
Replies: 4 comments 2 replies
-
这是没有使用generic的代码, 子类方法不能返回子类型 ---@class Vehicle
local Vehicle = {}
---@param self Vehicle
---@return Vehicle
function Vehicle:echo()
return self
end
---@param self Vehicle
---@return Vehicle
function Vehicle:drive()
self:echo()
return self
end
---@class Car:Vehicle
local Car = {}
local x = Car:drive() -- 这里x的类型是Vehicle, 但实际上应该是Car
|
Beta Was this translation helpful? Give feedback.
0 replies
-
还有个疑问 |
Beta Was this translation helpful? Give feedback.
0 replies
-
有个特殊返回类型叫self 你可以用---@return self |
Beta Was this translation helpful? Give feedback.
2 replies
-
試了一下可以對 ---@generic T: Vehicle
---@param self T|Vehicle
---@return T
function Vehicle:drive()
self.echo() -- 這裡就有提示了,也不影響最終的 return self 仍會按 generic type `T`
return self
end |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
比如父类
Vehicle:drive
方法, 为了确保子类Car调用drive能够返回Car类型, 我使用了generic如果确实是这样, 又会引出另一个问题:编写父类方法时就失去了父类的类型提示, 有办法解决吗?
![types](https://private-user-images.githubusercontent.com/8246344/326318255-5ed8bb8e-4666-45cf-94a8-c80d2ef7a441.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjEzMjU2MTEsIm5iZiI6MTcyMTMyNTMxMSwicGF0aCI6Ii84MjQ2MzQ0LzMyNjMxODI1NS01ZWQ4YmI4ZS00NjY2LTQ1Y2YtOTRhOC1jODBkMmVmN2E0NDEuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDcxOCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA3MThUMTc1NTExWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9MDg4OTJmZTllZTZlOTk2NGNiMDg0MDE3MGUzMmJmNGVlZmY3OTA1ZDA1YWIyNWVmNGYxNzNiODBlYmU0M2U5NyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.xH4TAGvD5jhSqJhlqk5gYVvE88EgFBGhc2I3dtDp5Wg)
Beta Was this translation helpful? Give feedback.
All reactions