
Product
Introducing Webhook Events for Alert Changes
Add real-time Socket webhook events to your workflows to automatically receive software supply chain alert changes in real time.
@huston007/ts-transformer-shape
Advanced tools
A custom TypeScript transformation to extract object structure from interface
A custom TypeScript transformation to extract object structure from interface
TypeScript >= 2.4.1
This package exports 2 functions.
One is shape which is used in TypeScript codes to obtain shape of given type, while the other is a TypeScript custom transformer which is used to compile the shape function correctly.
shapeimport { shape } from '@huston007/ts-transformer-shape';
interface Props {
id: string;
age: {test: number};
}
const keysOfProps = shape<Props>();
console.log(keysOfProps); // {id: null, age: {test: null}}
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.
See examples/webpack for detail.
// webpack.config.js
const shapeTransformer = require('@huston007/ts-transformer-shape/transformer').default;
module.exports = {
// ...
module: {
rules: [
{
test: /\.ts$/,
loader: 'ts-loader', // or 'awesome-typescript-loader'
options: {
getCustomTransformers: program => ({
before: [
shapeTransformer(program)
]
})
}
}
]
}
};
See examples/rollup for detail.
// rollup.config.js
import typescript from 'rollup-plugin-typescript2';
import shapeTransformer from '@huston007/ts-transformer-shape/transformer';
export default {
// ...
plugins: [
typescript({ transformers: [service => ({
before: [ shapeTransformer(service.getProgram()) ],
after: []
})] })
]
};
See examples/ttypescript for detail. See ttypescript's README for how to use this with module bundlers such as webpack or Rollup.
// tsconfig.json
{
"compilerOptions": {
// ...
"plugins": [
{ "transform": "ts-transformer-shape/transformer" }
]
},
// ...
}
See test for detail.
You can try it with $ npm test.
const ts = require('typescript');
const shapeTransformer = require('@huston007/ts-transformer-shape/transformer').default;
const program = ts.createProgram([/* your files to compile */], {
strict: true,
noEmitOnError: true,
target: ts.ScriptTarget.ES5
});
const transformers = {
before: [shapeTransformer(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-shape");
var keysOfProps = ["id", "name", "age"];
console.log(keysOfProps); // ['id', 'name', 'age']
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>();
}
}
MIT
FAQs
A custom TypeScript transformation to extract object structure from interface
We found that @huston007/ts-transformer-shape demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

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.

Product
Add real-time Socket webhook events to your workflows to automatically receive software supply chain alert changes in real time.

Security News
ENISA has become a CVE Program Root, giving the EU a central authority for coordinating vulnerability reporting, disclosure, and cross-border response.

Product
Socket now scans OpenVSX extensions, giving teams early detection of risky behaviors, hidden capabilities, and supply chain threats in developer tools.