https://github.com/janjakubnanista/ts-reflection
Type inspection utilities for TypeScript
https://github.com/janjakubnanista/ts-reflection
enum keys properties reflection typescript typescript-transformer
Last synced: 6 months ago
JSON representation
Type inspection utilities for TypeScript
- Host: GitHub
- URL: https://github.com/janjakubnanista/ts-reflection
- Owner: janjakubnanista
- License: mit
- Created: 2020-06-15T20:13:49.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2023-01-26T21:44:44.000Z (over 2 years ago)
- Last Synced: 2025-03-28T03:14:48.555Z (7 months ago)
- Topics: enum, keys, properties, reflection, typescript, typescript-transformer
- Language: TypeScript
- Homepage:
- Size: 1.88 MB
- Stars: 31
- Watchers: 1
- Forks: 3
- Open Issues: 35
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![]()
ts-reflection
Type inspection utilities for TypeScript
ts-reflection
allows you to access information about your types in runtime - e.g. get properties of a type or possible values of a union. It is compatible with rollup, webpack, and ttypescript projects and works nicely with jest or ts-node
Motivation
|
API
|
Installation
|
Acknowledgement## Wait what?
As they say *an example is worth a thousand API docs* so why not start with one.
```typescript
import { propertiesOf } from 'ts-reflection';interface MyInterface {
name: string;
hobbies: string[];
}// You can now use propertiesOf utility to get properties of a type
const properties = propertiesOf(); // ['name', 'hobbies']
```Let's do another one!
```typescript
import { valuesOf } from 'ts-reflection';type ButtonType = 'primary' | 'secondary' | 'link';
// You can use valuesOf utility to get all the possible union type values
const buttonTypes = valuesOf(); // ['primary', 'secondary', 'link']
```I can't count the number of times I needed to type all the possible values of a union type to create e.g. a dropdown with all the button types:
```typescript
type ButtonType = 'primary' | 'secondary' | 'link';const buttonTypes: ButtonType[] = ['primary', 'secondary', 'link'];
```I was always aware of fragility of such solution and the fact you need to update it by hand every time `ButtonType` changes. Now I can write just
```typescript
const buttonTypes: ButtonType[] = valuesOf;
```The same goes for a list of type properties - typing those lists of `keyof` type values:
```typescript
interface MyInterface {
property: number;
anotherProperty: string;
}type Key = keyof MyInterface;
const keys: Key[] = ['property', 'anotherProperty']
```Which now becomes
```typescript
const keys: Key[] = propertiesOf();
```## API
_You can find comprehensive API documentation in the [API docs](https://github.com/janjakubnanista/ts-reflection/blob/main/docs/API.md)._
`ts-reflection` exports two functions: `valuesOf` (for accessing values of union types) and `propertiesOf` (for accessing properties of types).
### `valuesOf`
`valuesOf` is a function that returns all the possible literal values of union types:
```typescript
import { valuesOf } from 'ts-reflection';type UnionType = 'string value' | 1 | true | Symbol.toStringTag;
// You can use valuesOf utility to get all the possible union type values
const unionTypeValues = valuesOf(); // ['string value', 1, true, Symbol.toStringTag]
```Please read the full [API docs](https://github.com/janjakubnanista/ts-reflection/blob/main/docs/API_REFLECTION.md#valuesOf) for more information about `valuesOf`.
### `propertiesOf`
`propertiesOf` is a function that returns property names of types:
```typescript
import { propertiesOf } from 'ts-reflection';interface MyInterface {
name: string;
displayName?: string;
readonly hobbies: string[];
}// When called with no arguments, propertiesOf() returns all public properties of a type
const properties = propertiesOf(); // ['name', 'displayName', 'hobbies']// You can also call it with "queries" to be more specific about what properties you want to get
const readonlyProperties = propertiesOf({ readonly: true }); // ['hobbies']
const mutableProperties = propertiesOf({ readonly: false }); // ['name', 'displayName']
const optionalProperties = propertiesOf({ optional: true }); // ['displayName']
const requiredProperties = propertiesOf({ optional: false }); // ['name', 'hobbies']
```Please read the full [API docs](https://github.com/janjakubnanista/ts-reflection/blob/main/docs/API_REFLECTION.md#propertiesOf) for more information about `propertiesOf` and the queries it supports.
## Installation
You can find comprehensive installation instructions in the [installation docs](https://github.com/janjakubnanista/ts-reflection/blob/main/docs/INSTALLATION.md).
This idea was inspired by [`ts-transformer-keys`](https://www.npmjs.com/package/ts-transformer-keys) NPM module. The E2E testing infrastructure that ensures compatibility with all minor TypeScript versions is based on my [`ts-type-checked`](https://www.npmjs.com/package/ts-type-checked) project.