-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Closed
Labels
Awaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureThis means we'd like to hear from more people who would be helped by this featureDomain: JSDocRelates to JSDoc parsing and type generationRelates to JSDoc parsing and type generationSuggestionAn idea for TypeScriptAn idea for TypeScript
Description
Search Terms
template default types, template default jsdoc, generic default jsdoc
Suggestion
In pure TypeScript we can have default values for generic parameters e.g.:
type LessThan<T> = (a: T, b: T) => boolean;
class PriorityQueue<Value, Priority=number> {
_comparePriority: LessThan<Priority>;
constructor(comparePriority: LessThan<Priority> = (a, b) => a < b) {
this._comparePriority = comparePriority;
// ...
}
add(value: Value, priority: Priority) {
// ...
}
pop(): Value {
// ...
}
}
const queue: PriorityQueue<Person, [number, string]>
= new PriorityQueue(compareByAgeThenAlphabetical)
However there doesn't seem to be a way to represent this in JSDoc, TypeScript seems to just split @template
on comma and take the longest identifier.
This proposal is to extend @template
in JSDoc to support generic defaults (e.g. Priority=number
).
Bikeshed syntax
The syntax isn't really important, but the capability would be helpful. I don't think this would cause any grammar issues but I'm not sure.
/**
* @template Value, Priority=number
*/
Use Cases
Same as within TypeScript, just extended to JSDoc.
Example with bikeshed syntax
/**
* @template T
* @typedef {(a: T, b: T) => boolean} LessThan
*/
/**
* @template Value
* @template Priority=number
*/
class PriorityQueue {
/** @type {LessThan<Priority>} */
_comparePriority;
/**
* @param {LessThan<Priority>} [comparePriority]
*/
constructor(comparePriority=(a, b) => a < b) {
this._comparePriority = comparePriority;
// ...
}
/**
* @param {Value} value
* @param {Priority} priority
*/
add(value, priority) {
// ...
}
/**
* @returns {Value}
*/
pop(): Value {
// ...
}
}
/** @type {PriorityQueue<Person, [number, string]>} */
const queue = new PriorityQueue(compareByAgeThenAlphabetical)
Checklist
My suggestion meets these guidelines:
- [✓] This wouldn't be a breaking change in existing TypeScript/JavaScript code
- [✓] This wouldn't change the runtime behavior of existing JavaScript code
- [✓] This could be implemented without emitting different JS based on the types of the expressions
- [✓] This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- [✓] This feature would agree with the rest of TypeScript's Design Goals.
brendankenny, jbwyme, VitorLuizC, siphomateke, rohit-gohri and 48 moreranndev, juniorUsca, steveswork, luketanner-sq, reduardo7 and 8 more
Metadata
Metadata
Assignees
Labels
Awaiting More FeedbackThis means we'd like to hear from more people who would be helped by this featureThis means we'd like to hear from more people who would be helped by this featureDomain: JSDocRelates to JSDoc parsing and type generationRelates to JSDoc parsing and type generationSuggestionAn idea for TypeScriptAn idea for TypeScript