Closed
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.