-
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
@deprecated JSDoc tag #390
Comments
How would this flow through the type system? interface X {
/*
* @deprecated Use DoOtherThing instead
*/
doThing(): void;
}
interface Y {
/*
* Still supported
*/
doThing(): void;
}
class Z implements X, Y {
doThing() {}
}
var g = new Z();
g.doThing(); // OK? Not OK? Presumably you'd be able to mark a single overload (but not others) as deprecated; would referencing (but not calling) a function with a deprecated overload be an error? |
Hmz, tricky question.. didn't thought about this one actually. Maybe it is only an error in this case when calling it like this: var x: X = new Z();
x.doThing() // it selected to @deprecated methode so error
var y: Y = new Z();
x.doThing() // still supporter, no error Not really sure though, feels a bit error prone... |
C# will allow what you've written above, because it does not react to [Obsolete] attributes on interfaces - only base class implementations. Given the lack of multiple inheritence, this isn't really an issue. Here's how it's handled in C#: class Program
{
static void Main(string[] args)
{
var x = new Zoo();
// doThing is allowed, even though it is obsolete on interface X
x.doThing();
// doStuff is not allowed. It is not obsolete on the interface, but is obsolete on the base class.
x.doStuff();
Console.Read();
}
}
interface X
{
/// <summary>
///
/// </summary>
[Obsolete("boo", true)]
void doThing();
}
interface Y
{
void doThing();
void doStuff();
}
class Zoo : ZooBase, X
{
public void doThing()
{
Console.WriteLine("boo");
}
[Obsolete]
public override void doStuff()
{
Console.WriteLine("boo");
}
}
abstract class ZooBase
{
[Obsolete("boo", true)]
public abstract void doStuff();
} |
I think this is fair. the class provided a re-declaration of the method. if you were to use the interface directly you would get an error: var g = new Z();
g.doThing(); // OK, this is the class definition of doThing()
var e: X = new Z();
e.doThing(); // Error, X.doThing() is deprecated. Now consider this: interface Person {
name: string;
/** @deprecated use birthDate instead */
age?: number;
birthDate?: Date;
}
declare function doStuff(p: Person): void;
// should calling doStuff with age instead of birthDate be an error:
doStuff({
name: "Joe",
age: 25 // Error?: Person.age is depreciated
}); if the answer is yes, then the above example should be an error on the extends clause, prohibiting the implementation of a depreciated method on the interface. it also means you can not depreciate a non-optional member of an interface, cause how else would you use it. |
I believe this shouldn't cause an error but rather a warning. interface IX {
@deprecated
function doSomething(): void;
}
class X implements IX {
function doSomething(): void; // Warning: IX.doSomething is deprecated
@deprecated
function doSomethingElse(): void;
}
const x = new X();
x.doSomething(); // Ok...
x.doSomethingElse(); // Warning: X.doSomethingElse is deprecated |
That syntax collides with decorators. 😦 Considering this hasn't seen any action in a long time, and now that the compiler parses and integrates JSDoc, it could in theory understand and warn on Otherwise this should be the domain of something like tslint @adidahiya, thoughts? |
Yeah I know. I didn't know that the complier considered JSDoc comments. I thought we might have a reserved keyword or something. AFAIK TS has no concept of warnings. In my opinion however, it should. Similar to ESLint's error/warning concepts. |
I disagree... It should be about things deal with code quality, things that are syntactical errors. tslint and other linting tools do lots of quality checking, like unused variables, conditional assignments, switch statement drop through and defaults, etc. In fact we draw the defenition from the UNIX
|
@kitsonk okay I'm convinced. I'll open a new issue in tslint's repo then. |
I also think this is something that does not need a language feature, but belongs to documentation (jsdoc) and can be checked by something like tslint. |
I kept the deprecated `pick` declarations, but added the proposed (JSDoc-influenced) [deprecation annotation](microsoft/TypeScript#390) to them. The added `pickone` and `pickset` declarations have identical types to their respective `pick` flavors.
* Fixes #10684 I kept the deprecated `pick` declarations, but added the proposed (JSDoc-influenced) [deprecation annotation](microsoft/TypeScript#390) to them. The added `pickone` and `pickset` declarations have identical types to their respective `pick` flavors. * Added Seeded interface to Chance definition
We have homegrown @deprecated decorator but adding this in the language feature so it can be better visible in .d.ts-es would be great! Can you make two flavors of it (like @deprecated and @obsolete) where one will warn and the other will err. The workflow would be to make stuff that is about to be removed with @deprecated for a version or two so the downstream dependencies can have time to upgrade and then move from @deprecated to @obsolete in the .d.ts when the member is deleted. At runtime it would be up to the library to promise the @deprecated to work even though with degraded quality, while the @obsolete will be expected to throw. |
@PanayotCankov The distinction you make between @deprecated and @obsolete is not intuitive to me, though maybe it is or other people. Perhaps @removed would communicate the expected behavior? I am not sure I've ever found myself needing multiple levels of deprecation, but it could still be a good idea. |
Where are we with this issue? @deprecated on an interface doesn't cause any kind of warning in Visual Studio and it should... I'm not talking about layers deep. Can we at least get one layer? So if we are trying to use something that has the @deprecated tag on it, it shows a warning or something in the IDE? The @deprecated intellisense isn't working in visual studio.... is it working somewhere else? |
@felixfbecker The main problem with this solution is it doesn't check external modules. If typescript adds support for this it will work with external modules (and type declarations). |
We'd be interested in this as well |
+1 |
I'd like to work on this both ts and vscode side. |
It's unclear to me from this proposal whether deprecating an entry in a union would be supported. type Props = {
value:
| 'a'
| 'one'
/** @deprecated */
| 'value-one'
} If so great 👍. If not would it be possible to include that in this proposal or would it be better to create a separate proposal? |
@luke-john I think union and insertion type members don't support TSDoc at all. |
You're correct that they don't support tsdoc style comments (seems to be a recent issue requesting that at #38106) However they do support typescript comments such as |
Since this is now a thing, it could be removed from Roadmap Future section
|
Before e.g. /** @deprecated */
type LegacySizes =
| "sm"
| "lg";
export type ButtonSizes =
| LegacySizes
| "small"
| "medium"
| "large";
export interface ButtonProps {
size?: ButtonSizes;
} |
Is this supported now? If so where are the docs for this? (Or can anyone share an example?) |
Is it possible to mark all deprecated warnings? |
@SebastianStehle Perhaps you can use something like https://github.com/gund/eslint-plugin-deprecation |
Also, we can use https://www.npmjs.com/package/eslint-plugin-sonar // .eslintrc.cjs
{
"plugins": ["sonar"],
"rules": {
"sonar/deprecation": 1
}
} |
It would be cool to annotate a method or property with a deprecated attribute
Proposal
If a warning could be issued when using a deprecated method or property it is easier to upgrade to a newer library version (only when the definitions are up to date of course)
Syntax: Same as JSDoc, a simple comment
If supported in .d.ts files, this would really help with upgrading to a newer version.
The text was updated successfully, but these errors were encountered: