Skip to content

nullcc/ts-interface-keys-transformer

Repository files navigation

ts-interface-keys-transformer

ts-interface-keys-transformer is inspired by ts-transformer-keys. It uses custom transformer to parse the keys in 'interface' and 'type' in compile stage in TypeScript which support nested keys and optionality.

Usage

$ npm i -D typescript ttypescript ts-interface-keys-transformer

and then add following to "compilerOptions" field in tsconfig.json:

"plugins": [
      { "transform": "ts-interface-keys-transformer/transformer" }
    ]

Use following command to run (assume index.js is the compiled file of index.ts):

$ ttsc -p tsconfig.json && node index.js

Nested interface

import { keys } from 'ts-interface-keys-transformer';

interface Foo {
  a: string;
  b: number;
  c: Bar;
}

interface Bar {
  a: string;
  b: number;
}

// [
//   { name: 'a', optional: false },
//   { name: 'b', optional: false },
//   { name: 'c', optional: false },
//   { name: 'c.a', optional: false },
//   { name: 'c.b', optional: false },
//]
console.log(keys<Foo>());

Nested type

import { keys } from 'ts-interface-keys-transformer';

type Foo = {
  a: string;
  b: number;
  c: Bar;
}

type Bar = {
  d: string;
  e: number;
  f: boolean;
}

// [
//   { name: 'a', optional: false },
//   { name: 'b', optional: false },
//   { name: 'c', optional: false },
//   { name: 'c.d', optional: false },
//   { name: 'c.e', optional: false },
//   { name: 'c.f', optional: false },
//]
console.log(keys<Foo>());

Mix interface and type

import { keys } from 'ts-interface-keys-transformer';

interface Foo {
  a: string;
  b: number;
  c: Bar;
}

type Bar = {
  d: string;
  e: number;
  f: boolean;
}

// [
//   { name: 'a', optional: false },
//   { name: 'b', optional: false },
//   { name: 'c', optional: false },
//   { name: 'c.d', optional: false },
//   { name: 'c.e', optional: false },
//   { name: 'c.f', optional: false },
//]
console.log(keys<Foo>());

Interface properties has question mark

import { keys } from 'ts-interface-keys-transformer';

type Foo = {
  a?: string;
  b: number;
  c: Bar; 
}

interface Bar {
  d?: string;
  e?: number;
  f: boolean;
}

// [
//   { name: 'a', optional: true },
//   { name: 'b', optional: false },
//   { name: 'c', optional: false },
//   { name: 'c.d', optional: true },
//   { name: 'c.e', optional: true },
//   { name: 'c.f', optional: false },
//]
console.log(keys<Foo>());

Run tests

npm test

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published