Description
Bug Report
I'm attempting to use mapped types over an interface and I want the documentation for the properties from the original interface to be preserved when the mapped interface is implemented by a class. This normally is fine unless the mapper removes some keys from the original interface. The example below actually shows that Omit<>
and a 1-level expansion of Omit<>
works fine to preserve documentation over the remaining properties. However, if I expand it one more time into a raw mapped type expression, then I suddenly lose documentation.
Unfortunately I can't use either of the first two options in the code I'm trying to write because I'm doing conditional typing on the value side of the map.
Thanks folks!
🔎 Search Terms
omit, exclude, mapped types, documentation, tsdoc, jsdoc, properties, implements, class, hover, intellisense, vscode, quick info
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about mapped types
⏯ Playground Link
Playground link with relevant code
💻 Code
interface MyInterface {
/**
* Documentation for prop1
*/
prop1: number;
/**
* Documentation for prop2
*/
prop2: string;
/**
* Documentation for prop3
*/
prop3: boolean;
}
//
// 1: Omit preserves documentation! (Except for 3.3.3 as Omit wasn't added at that point)
//
type MyModifiedInterface1_DocumentationPreserved = Omit<MyInterface, 'prop3'>;
class MyClass1_DocumentationPreserved implements MyModifiedInterface1_DocumentationPreserved {
prop1 = 1; // Hover doc: Documentation for prop1
prop2 = 'a'; // Hover doc: Documentation for prop2
}
//
// 2: So does expanding Omit!
//
type MyModifiedInterface2_DocumentationPreserved = Pick<MyInterface, Exclude<keyof MyInterface, 'prop3'>>;
class MyClass2_DocumentationPreserved implements MyModifiedInterface2_DocumentationPreserved {
prop1 = 1; // Hover doc: Documentation for prop1
prop2 = 'a'; // Hover doc: Documentation for prop2
}
//
// 3: But expanding Pick causes documentaiton to be lost!
//
type MyModifiedInterface3_DocumentationLost = {
[P in Exclude<keyof MyInterface, 'prop3'>]: MyInterface[P];
};
class MyClass3_DocumentationLost implements MyModifiedInterface3_DocumentationLost {
prop1 = 1; // Hover doc missing!
prop2 = 'a'; // Hover doc missing!
}
🙁 Actual behavior
In VSCode, hovering over prop1
and prop2
in the MyClass3_DocumentationLost class result in none of the documentation from MyInterface showing.
🙂 Expected behavior
In VSCode, in the MyClass3_DocumentationLost class, hovering over the following props should so the corresponding documentation from MyInterface:
prop1
-> "Documentation for prop1"prop2
-> "Documentation for prop2"