Сорбет - конкретный тип при наследовании от универсального класса - PullRequest
0 голосов
/ 28 октября 2019

Как мне указать String для универсального типа?

→ Посмотреть на 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

1 Ответ

0 голосов
/ 28 октября 2019

Вы можете использовать

Elem = type_member(fixed: String)

Повторное объявление члена типа родителя уже является обязательным (что вы можете увидеть в сообщении об ошибке во фрагменте кода, в котором написано Type Elem declared by parent Array must be re-declared in NameList) и повторно объявить егос параметром fixed: позволяет указать этот тип параметра как конкретный тип.

→ Просмотр на 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
...