`.h` files are not something to emulate! External interfaces should be generated by tools where needed.
`.h` files are not something to emulate! External interfaces should be generated by tools where needed.
Here's a full example, complete with a typo, based on the example in the blog post: https://bit.ly/3hMEMSp
Here's a truncated excerpt to get the basic idea across:
    # typed: true
    class Merchant
      extend T::Sig
      sig {returns(String)}
      attr_reader :name
      sig {returns(T::Array[Employee])}
      attr_reader :employees
      sig {params(token: String, name: String).void}
      def initialize(token, name)
        @token = token
        @name = name
      end
    end
    module T
       module Sig
         def sig *args
         end
       end
       # You'd need to stub out a few more things here.
    end
    begin
      require 'sorbet-runtime'
    rescue LoadError
    end
You can configure things like this globally and/or for each method call.
Eg;
    # turn off all runtime checks
    T::Configuration.default_checked_level = :never
    # turn off runtime checks for one method
    sig {returns(String).checked(:never)}
    def foo; :wont-raise; end
Personally if I were authoring a gem I'd leave the runtime checks on except in hot paths, so my users get quick feedback when they pass the wrong thing.
In any case, the library author can get the benefits of static and runtime typing, and their users will get nice static typing if they use sorbet. Users also get nice runtime typing for the library if the author chooses to leave it on for them. The overhead is usually small.