-
Notifications
You must be signed in to change notification settings - Fork 12.5k
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
[Feature] Generic Reference Syntax Proposal #59126
Comments
I don't understand the scoping for these For #26242 I think it would be almost required for the type parameter to be scoped to the function and not some outer scope. What are the benefits of |
The purpose is to address the issue of privatized generics and optional generics You can refer to my example 1.
When we need to infer the return value a function, we need to infer it the function input values. This process does not require user input. However, the existing design approach requires that the generic variable be defined on the function, the user to interfere with our inference. function define<T, Options extends Option[]>(value: T, ...agrs: Options): Ref<Options> {}
// In this case
// we do not want the user to set a second generic because it will interfere with our inference of args,
// but we need the user to fill in the first generic to constrain the value.
define<string, any>('') // So I need to hide my `Options[]`
ref Options
function define<T>(value: T, ...args: Options): Ref<Options> {}
define<string>('') // This is great. |
I still don't understand what it means for two different functions to access the same I also don't quite see the use case for preventing a user from manually specifying the type argument. You say "interfering with our inference" but why would that be a problem? What is the use case for private generics? Could you show an example where a user "interfering" with inference leads to a bad outcome? |
For example, the code of Vue. Link Can be used in overloaded or more functions of the same type (this requires more examples to be given by everybody, and the use of the same ref for multiple functions is just one possibility)
you can see this Playground this's use ref syntax Playground |
This design doesn't really seem to fit in with the language very well, primarily because the scoping is extremely confusing. You have this example: ref O
function define<T>(value: T, options: O): Ref<O> {}
define<string>('input any strings', 123) // 👍 <string>(value: string, options: number) => Ref<number> But you could equally have written something like ref O
function define<T>(value: T, options: O): Ref<O> {
// is p: number because it's a new inference site for O
// or is p: O? How do you tell?
const p = inner(32);
function inner(foo: O): O { }
} It's not at all clear whether |
👍Great! The purpose of this is to address the issue: Because the need for optional generics in the community has been raised for a time, I hope that the TypeScript official can come up with a solution to address the dilemma of us developers. |
In addition, if 'ref' is used in multiple places, the compiler should infer the collected type: ref O
const func: (value: O) => O = v => v
func(1) // <- collect: number
func('1') // <- collect: string
func(true) // <- collect: boolean
func(new Date()) // <- collect: Date The compiler will collect: If the collected by the compiler are inconsistent, an error will be reported, otherwise, it will compile normally. |
This issue has been marked as "Declined" and has seen no recent activity. It has been automatically closed for house-keeping purposes. |
🔍 Search Terms
✅ Viability Checklist
⭐ Suggestion
Background
The current version of TypeScript often requires explicitly passing multiple generic parameters, leading to code duplication and redundancy in certain scenarios. Inspired by TypeScript Issue #26242, we propose a new keyword
ref
, aimed at simplifying the reference and application of generics, and enhancing the readability and maintainability of the code.Function Description
The keyword
ref
is used to declare a generic reference, which can be reused in functions, classes, or other generic definitions without the need for repeated declaration. Usingref
, one can define default values for generics, and it supports exporting and cross-file referencing.Syntax
📃 Motivating Example
Solving the Optional Generic Input Problem
Use
ref
to simplify function definitions, automatically infer generic parameters, and achieve private generic reference functionality:Cross-Function, Cross-File Constraints
ref
supports cross-file referencing, achieving unified type constraints:Conclusion
This proposal aims to simplify the use of generics by introducing the
ref
keyword, thereby enhancing TypeScript's development efficiency and code quality.For instance, Vue.js V2 v3-component-options.d.ts#L75 If there is a
ref
keyword, then won't be so many generic variables stored on the function, and the code will be much cleaner.We look forward to community feedback and further discussion.
❗️Warning❗️
This proposal does not conflict with optional input generics, but it can solve problems such as private generics.
The text was updated successfully, but these errors were encountered: