Sorbet-从泛型类继承时的具体类型

问题描述 投票:0回答:1

如何为通用类型指定String

→ View on sorbet.run

# typed: strict


class NameList < Array
  extend T::Sig

  sig {params(names: T::Array[String]).void}
  def initialize(names)
    names.each { |n| self << n}
  end

  sig {returns(String)}
  def csv
    (map { |n| n.join(',') }).join("\n")
  end
end


nl = NameList.new(['Bruce', 'Clark', 'Peter'])

# Output length of first name.
puts(nl.first&.size)  # String#size
puts(nl.first&.sizee)  # misspelled size - should be an error

# Sorbet-Static output:
# editor.rb:4: Type Elem declared by parent Array must be re-declared in NameList https://srb.help/5036
#      4 |class NameList < Array
#         ^^^^^^^^^^^^^^^^^^^^^^
#     https://github.com/sorbet/sorbet/tree/master/rbi/core/array.rbi#L350: Elem declared in parent here
#      350 |  Elem = type_member(:out)
#             ^^^^^^^^^^^^^^^^^^^^^^^^
# Errors: 1
ruby sorbet
1个回答
0
投票

您可以使用

Elem = type_member(fixed: String)

重新声明父级的类型成员已经是必须的(您可以在代码段的错误消息中看到,该错误消息显示为Type Elem declared by parent Array must be re-declared in NameList),然后使用fixed:参数进行重新声明,可以指定该类型参数作为具体类型。

→ View on sorbet.run

# typed: strict

class NameList < Array
  extend T::Sig

  Elem = type_member(fixed: String)

  sig {params(names: T::Array[String]).void}
  def initialize(names)
    names.each { |n| self << n}
  end

  sig {returns(String)}
  def csv
    (map { |n| n.join(',') }).join("\n")  # Method `join` does not exist on String
  end
end


nl = NameList.new(['Bruce', 'Clark', 'Peter'])

# Output length of first name.
puts(nl.first&.size)
puts(nl.first&.sizee)  # Method `sizee` does not exist on String
© www.soinside.com 2019 - 2024. All rights reserved.