-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dynamically named tuples #44939
Comments
See also the somewhat off-topic discussion at #41594 |
Need this to generate state repositories. The basic version could look like type StateRepository<T extends string, E> =
& { [K in `set${Capitalize<T>}`]: (...args: [[T]: E]) => void }
// Dynamically named tuples are used here ^^^
& { [K in `get${Capitalize<T>}`]: () => E }
const capitalize = <S extends string>(string: S) => string.charAt(0).toUpperCase() + string.slice(1) as Capitalize<S>
const getStateRepository = <T extends string, E>(name: T, start: E): StateRepository<T, E> => {
let state = start
const cName = capitalize(name)
return {
[`set${cName}`]: data => { state = data },
[`get${cName}`]: () => state,
}
}
const counterRepository = getStateRepository('counter', 0)
counterRepository.setCounter(1)
const value = counterRepository.getCounter() |
I think my example is too specific and not well presented. The more common problem people face is the one @awerlogus suggested: having a function whose return type is based on the parameters. |
Commented on the design meeting issue related to this one with a motivating use-case. Linking it up here: #55511 (comment) |
Is there any update for this? |
I ran into this issue today attempting to dynamically generate id parameter names from a known field tuple for primary keys:
Unfortunately, I am limited to:
I want to be able to name the tuple generated in
This would be epic! My actual code looks like:
But there is no way to dynamically set the generated tuple element name in this case. One suggestion is that we could name generated tuple elements like
|
I ran into a similar use case, namely for some GraphQL work I'm doing. I have interfaces auto-generated for me for resolver functions in the form export abstract class IQuery {
abstract myResolver(arg1: Nullable<string>, arg2: Nullable<number>): Nullable<MyResult>;
} And when I'm writing integration tests against it, I have a utility method in the format of: cy.graphQLRequest<TExpectedResult = unknown, TVariables = Record<string, string | number | boolean | null>>({
operation: DocumentNode;
variables: TVariables;
}): Chainable<TExpectedResult>; I can get the parameters of the resolver fairly trivially through type ParametersAsRecord<T extends (...args: any) => any> = T extends (...args: infer [ParameterName, ParameterType]) => any ? {
[key in ParameterName]: ParameterType
} : never would be ideal. |
Suggestion
TypeScript's type system is extremely expansive and powerful, but one thing that I cannot seem to do is give tuples dynamic names. Eg:
Or even:
Just like objects, we should be able to use bracket syntax to indicate that the expression inside should be used as the name.
We can then proceed to use other types to "calculate" the names.
🔍 Search Terms
✅ Viability Checklist
My suggestion meets these guidelines:
I believe this one meets the last guideline because of goals 2 and 4.
⭐ Suggestion
Dynamically/calculated/inserted tuple names instead of static ones.
📃 Motivating Example
Consider the following example (ripped from a project of mine):
Instead of boring, bland names, I could use this new feature to give them more descriptive/detailed names.
Names are important because they describe the object in as few words as possible.
components_0
simply does not convey the same idea asx
.Suppose I create a type
InsertTupleNames
to create a tuple whose names are calculated, then I could use:Which means, the parameters are now named the correct names, and they make more sense to the end user.
Currently, I have to settle for a massive tuple containing all possible lists of parameter names, which is not ideal or maintainable.
💻 Use Cases
It would make more complex types/functions more readable/usable.
I think this example I have shown demonstrates that TypeScript's type system is extremely powerful, and so powerful that we can already create standalone types based on another one (aka
CreateVector
createsVectorStruct<...>
andVectorStruct
is a standalone type, functional, and solely created fromCreateVector
).If we had this then we could make spread parameters and the outputted JavaScript easier to read with higher legibility.
The text was updated successfully, but these errors were encountered: