New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

tst-reflect

Package Overview
Dependencies
Maintainers
1
Versions
59
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

tst-reflect

Runtime of TypeScript Transformer for Runtime Types & Reflection

latest
Source
npmnpm
Version
0.12.0
Version published
Weekly downloads
2.3K
8.18%
Maintainers
1
Weekly downloads
 
Created
Source

Runtime Types & Reflection (tst-reflect) runtime part

tst-reflect tst-reflect-transformer License MIT

This package is runtime part of tst-reflect-transformer, which is TypeScript transformer/plugin generating Type metadata objects that are working at runtime, providing information about types such as list of properties and their types, list of constructors and their parameters and types and so on.

With working runtime generic types!

Visit Github repository for more information

How to Get Type?

import { getType } from "tst-reflect";

interface IFoo {}
class Foo implements IFoo {}

getType<IFoo>();
getType<Foo>();
getType(Foo);

const foo = new Foo();
getType<typeof foo>();
getType(foo);

Simple Example

import { getType, Type } from "tst-reflect";

function printClassInfo<TType>()
{
    const type: Type = getType<TType>(); // <<== get type of generic TType

    console.log(type.name); // > Animal
    console.log(type.fullName); // > @@this/index.ts:Animal#21869

    console.log(type.getProperties().map(p => `${p.name}: ${p.type.name}`).join("\n")); // > name: string
    console.log(type.getMethods().map(m => `${m.name}(): ${m.returnType.name}`).join("\n")); // > makeSound(): string

    return type.name;
}

abstract class Animal
{
    private name: string;
    abstract makeSound(): string;
}

printClassInfo<Animal>();

How to Start

  • Install packages.
npm i tst-reflect && npm i tst-reflect-transformer -D
npm i ttypescript -D
  • Add transformer to tsconfig.json
{
    "compilerOptions": {
        // your options...

        // ADD THIS!
        "plugins": [
            {
                "transform": "tst-reflect-transformer"
            }
        ]
    }
}
  • Now just transpile your code by ttsc instead of tsc
npx ttsc

Using Webpack

Modify your webpack config. Use options.compiler of ts-loader to set ttypescript compiler.

({
    test: /\.(ts|tsx)$/,
    loader: require.resolve("ts-loader"),
    options: {
        compiler: "ttypescript"
    }
})

Using Parcel

Install Parcel plugin.

npm i parcel-plugin-ttypescript

Using Rollup

Install Rollup plugin

npm i rollup-plugin-typescript2

and modify your rollup config.

import ttypescript from "ttypescript";
import tsPlugin from "rollup-plugin-typescript2";

export default {
    // your options...
    
    plugins: [
        // ADD THIS!
        tsPlugin({
            typescript: ttypescript
        })
    ]
}

Using ts-node

Modify your tsconfig.json.

{
    "compilerOptions": {
        // your options...

        "plugins": [
            {
                "transform": "tst-reflect-transformer"
            }
        ]
    },
    
    // ADD THIS!
    "ts-node": {
        // This can be omitted when using ts-patch
        "compiler": "ttypescript"
    },
}

Obtaining Type

Runtime package (tst-reflect) contains two main exports, getType<T>() function and Type class. To get Type instance, you have to call getType<InterfaceOrClassOrSomeType>().

How does it work

Transformer looks for all calls of getType<T>() and replace those calls by Type retrieving logic. It generates object literals describing referred types and instances of Type are created from those objects.

Metadata

Mentioned object literals describing types are called metadata. Default behavior collect metadata of all used types and generate file metadata.lib.js in project root ( location of tsconfig.json).

Metadata library file looks like this:

var {getType} = require("tst-reflect");
getType({
    k: 5,
    props: [{n: "foo", t: getType({n: "string", k: 2})}, {
        n: "bar",
        t: getType({k: 3, types: [getType({k: 6, v: "a"}), getType({k: 6, v: "b"})], union: true, inter: false})
    }]
}, 22974);
getType({k: 5, props: [{n: "foo", t: getType({n: "string", k: 2})}, {n: "bar", t: getType({n: "string", k: 2})}]}, 22969);
getType({
    n: "SomeType",
    fn: "..\\logger.ts:SomeType",
    props: [{n: "array", t: getType({k: 4, n: "Array", args: [getType(22969)]})}],
    ctors: [{params: []}],
    k: 1,
    ctor: () => SomeType
}, 22965);
getType({
    n: "Foo",
    fn: "..\\logger.ts:Foo",
    props: [{n: "prop", t: getType({n: "number", k: 2})}],
    ctors: [{params: [{n: "prop", t: getType({n: "number", k: 2})}]}],
    k: 1,
    ctor: () => Foo
}, 22976);

Configuration

Configuration [wiki]

More Information

More information in README in the root repository folder.

Or check examples or dev scripts we use to test things.

License

This project is licensed under the MIT license.

Keywords

runtime

FAQs

Package last updated on 01 Sep 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts