An open API service indexing awesome lists of open source software.

https://github.com/p-toy-factory/ts-nameof-proxy

Type safely generate property name or path of variable.
https://github.com/p-toy-factory/ts-nameof-proxy

form nameof

Last synced: 7 months ago
JSON representation

Type safely generate property name or path of variable.

Awesome Lists containing this project

README

        

# ts-nameof-proxy

`nameof` in TypeScript, no compiler required. Implemented using proxy with some limitations.

Type safely generate property name or path of variable, referenced properties can be renamed in bulk by the editor.

## Install

```
npm install ts-nameof-proxy
```

## Usage

```ts
nameOf(student, (s) => s.age); // "age"
nameOf(student, (s) => s.name.length); // "length"
nameOf((s) => s.name.length); // "length"

pathOf(student, (s) => s.age); // ["age"]
pathOf(student, (s) => s.name.length); // ["name", "length"]
pathOf((s) => s.name.length); // ["name", "length"]

pathStringOf(student, (s) => s.name.firstName[0]); // "['name']['firstName']['0']"
pathStringOf((s) => s.name.firstName[0]); // "['name']['firstName']['0']"

namesOf(student, (s) => (s.age, s.name.length)); // ["age", "length"]
namesOf((s) => (s.age, s.name.length)); // ["age", "length"]

pathsOf(student, (s) => (s.age, s.name.length)); // [["age"], ["name", "length"]]
pathsOf((s) => (s.age, s.name.length)); // [["age"], ["name", "length"]]

pathStringsOf(student, (s) => (s.name, s.name.firstName[0])); // ["['name']", "['name']['firstName']['0']"]
pathStringsOf((s) => (s.name, s.name.firstName[0])); // ["['name']", "['name']['firstName']['0']"]
```

## Limitations

The example below is NOT feasible:

```ts
nameOf(student); // ❌ Will throw error
nameOf(student, (student) => student); // ❌ Will throw error
```

## Example

```tsx
const people = [
{ name: { firstName: "John", lastName: "Doe" } },
{ name: { firstName: "Jane", lastName: "Smith" } },
];

{}}>

{({ values }) =>
values.map((person, index) => (


values[index].name.firstName
)}
/>
values[index].name.lastName)}
/>

))
}
{/*
Output:




*/}

;
```