Project

rbs2ts

0.01
No commit activity in last 3 years
No release in over 3 years
A RubyGem that converts Ruby RBS to TypeScript definitions.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

>= 2.1.4
~> 10.0
~> 3.0

Runtime

~> 1.0.0
>= 0
 Project Readme

Rbs2ts

A RubyGem that converts Ruby RBS to TypeScript definitions.

Installation

gem install rbs2ts

Usage

rbs2ts convert type.rbs

Example

from RBS

type TypeofInteger = Integer
type TypeofFloat = Float
type TypeofNumeric = Numeric
type TypeofString = String
type TypeofBool = Bool
type TypeofVoid = void
type TypeofUntyped = untyped
type TypeofNil = nil

type IntegerLiteral = 123
type StringLiteral = 'abc'
type TrueLiteral = true
type FalseLiteral = false

type IntersectionType = String & Integer & Bool
type UnionType = String | Integer | Bool

type ArrayType = Array[String]

type TupleType = [ ]
type TupleEmptyType = [String, Integer]

type OptionalType = String?

type RecordType = {
  s: String,
  next: {
    i: Integer,
    f: Float
  }?
}

class Klass
  @val: String
  attr_accessor a: String
  attr_reader b: Integer
  attr_writer c: Bool

  attr_reader r: {
    d: String,
    e: {
      f: String,
      g: String?
    }?
  }

  def to_tuple: () -> [{ s: String, f: Float }?]
  def required_positional: (String) -> void
  def required_positional_name: (String str) -> void
  def optional_positional: (?String) -> void
  def optional_positional_name: (?String? str) -> void
  def rest_positional: (*String) -> void
  def rest_positional_name: (*String str) -> void
  def rest_positional_with_trailing: (*String, Integer) -> void
  def rest_positional_name_with_trailing: (*String str, Integer trailing) -> void
  def required_keyword: (str: String) -> void
  def optional_keyword: (?str: String?) -> void
  def rest_keywords: (**String) -> void
  def rest_keywords_name: (**String rest) -> void

  def all_arguments: (
    String required_positional,
    ?Integer? optional_positional,
    *String rest_positionals_s,
    Integer trailing_positional_s,
    required_keyword: String,
    ?optional_keyword: Integer?,
    **String rest_keywords
  ) -> [{ s: String, f: Float }?]
end

module Module
  @val: String
  type AliasType = String

  def func: (String, Integer) -> { str: String, int: Integer }

  class NestedClass
    attr_accessor a: AliasType
  end
end

interface _Interface
  def func: (String, Integer) -> { str: String, int: Integer }
end

to TypeScript

export type TypeofInteger = number;

export type TypeofFloat = number;

export type TypeofNumeric = number;

export type TypeofString = string;

export type TypeofBool = boolean;

export type TypeofVoid = void;

export type TypeofUntyped = any;

export type TypeofNil = null;

export type IntegerLiteral = 123;

export type StringLiteral = "abc";

export type TrueLiteral = true;

export type FalseLiteral = false;

export type IntersectionType = string & number & boolean;

export type UnionType = string | number | boolean;

export type ArrayType = string[];

export type TupleType = [];

export type TupleEmptyType = [string, number];

export type OptionalType = string | null | undefined;

export type RecordType = {
  s: string;
  next: {
    i: number;
    f: number;
  } | null | undefined;
};

export declare class Klass {
  val: string;
  a: string;
  readonly b: number;
  c: boolean;
  readonly r: {
    d: string;
    e: {
      f: string;
      g: string | null | undefined;
    } | null | undefined;
  };
  toTuple(): [({
    s: string;
    f: number;
  } | null | undefined)];
  requiredPositional(arg1: string): void;
  requiredPositionalName(str: string): void;
  optionalPositional(arg1?: string): void;
  optionalPositionalName(str?: string | null | undefined): void;
  restPositional(...arg1: string[]): void;
  restPositionalName(...str: string[]): void;
  restPositionalWithTrailing(arg1: string[], arg2: number): void;
  restPositionalNameWithTrailing(str: string[], trailing: number): void;
  requiredKeyword(arg1: { str: string }): void;
  optionalKeyword(arg1: { str?: string | null | undefined }): void;
  restKeywords(arg1: { [key: string]: unknown; }): void;
  restKeywordsName(arg1: { [key: string]: unknown; }): void;
  allArguments(requiredPositional: string, optionalPositional?: number | null | undefined, restPositionalsS?: string[], trailingPositionalS?: number, arg1?: { requiredKeyword: string, optionalKeyword?: number | null | undefined, [key: string]: unknown; }): [({
    s: string;
    f: number;
  } | null | undefined)];
};

export namespace Module {
  export declare let val: string;
  export type AliasType = string;
  export declare function func(arg1: string, arg2: number): {
    str: string;
    int: number;
  };
  export declare class NestedClass {
    a: AliasType;
  };
};

export interface Interface {
  func(arg1: string, arg2: number): {
    str: string;
    int: number;
  };
};