ts-transformer-keys
A TypeScript custom transformer which enables to obtain keys of given type.
Requirement
TypeScript >= 2.4.1
How to use this package
This package exports 2 functions.
One is keys
which is used in TypeScript codes to obtain keys of given type, while the other is a TypeScript custom transformer which is used to compile the keys
function correctly.
How to use keys
import { keys } from 'ts-transformer-keys';
interface Props {
id: string;
name: string;
age: number;
}
const keysOfProps = keys<Props>();
console.log(keysOfProps);
How to use the custom transformer
Unfortunately, TypeScript itself does not currently provide any easy way to use custom transformers (See https://github.com/Microsoft/TypeScript/issues/14419).
The followings are the example usage of the custom transformer.
webpack (with ts-loader or awesome-typescript-loader)
See examples/webpack for detail.
const keysTransformer = require('ts-transformer-keys/transformer').default;
module.exports = {
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader',
options: {
getCustomTransformers: program => ({
before: [
keysTransformer(program)
]
})
}
}
]
}
};
Rollup (with rollup-plugin-typescript2)
See examples/rollup for detail.
import resolve from 'rollup-plugin-node-resolve';
import typescript from 'rollup-plugin-typescript2';
import keysTransformer from 'ts-transformer-keys/transformer';
export default {
plugins: [
resolve(),
typescript({ transformers: [service => ({
before: [ keysTransformer(service.getProgram()) ],
after: []
})] })
]
};
ttypescript
See examples/ttypescript for detail.
See ttypescript's README for how to use this with module bundlers such as webpack or Rollup.
{
"compilerOptions": {
"plugins": [
{ "transform": "ts-transformer-keys/transformer" }
]
},
}
TypeScript API
See test for detail.
You can try it with $ npm test
.
const ts = require('typescript');
const keysTransformer = require('ts-transformer-keys/transformer').default;
const program = ts.createProgram([], {
strict: true,
noEmitOnError: true,
target: ts.ScriptTarget.ES5
});
const transformers = {
before: [keysTransformer(program)],
after: []
};
const { emitSkipped, diagnostics } = program.emit(undefined, undefined, undefined, false, transformers);
if (emitSkipped) {
throw new Error(diagnostics.map(diagnostic => diagnostic.messageText).join('\n'));
}
As a result, the TypeScript code shown here is compiled into the following JavaScript.
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ts_transformer_keys_1 = require("ts-transformer-keys");
var keysOfProps = ["id", "name", "age"];
console.log(keysOfProps);
Note
- The
keys
function can only be used as a call expression. Writing something like keys.toString()
results in a runtime error. keys
does not work with a dynamic type parameter, i.e., keys<T>()
in the following code is converted to an empty array([]
).
class MyClass<T extends object> {
keys() {
return keys<T>();
}
}
License
MIT