Skip to content

Regression: DTS emit #38356

Closed
Closed

Description

@Jack-Works

Works in TS 3.9.0 beta but not in nightly (4.0.0-dev.20200505)

Code:

class X {
    /**
      * Cancels the request, sending a cancellation to the other party
      * @param {Object} error __auto_generated__
      * @param {string?} error.reason the error reason to send the cancellation with
      * @param {string?} error.code the error code to send the cancellation with
      * @returns {Promise.<*>} resolves when the event has been sent.
      */ 
    async cancel({reason = "User declined", code = "m.user"} = {}) {}
}

Playground:

https://www.typescriptlang.org/v2/en/play?ts=4.0.0-dev.20200505&useJavaScript=true#code/MYGwhgzhAEAa0G8CwAoa7oHoBU3UY22gGEwA7YAUxBgBcALS6AJ0oEcBXSiWgGmgiUyAEwCWZAObQw0YOSohwtUQHsy0Wio2NoKhpWbQADmGa0AnvgLQiAARPMwAW0QB5AEYArSsFoBfaANmFUMAfVCwDk1QiSEDMFpKYXCrAjsHZ0QeZnEJAH4AoJCAOlZINW0mIsMyiArNASFhStl5aiVVdQB3UQZUwmh7U0yEbNyCwOZg5mLgFWEmfUnp2XnFrUERFrkKdoTO6B6+tGs7VloOZjIYBAAFYKdRQWKAHmwAPgDWOpAAN25Dox1EtKP8yLRoPRINB3JQhI1wcV+uhsJhoP1IOYKK1diAABQIWoVAC80AARABVQSGBagcRJMn8OYLaCkslOYocalkgKkhB+ACUiD8qFQfiAA

Old output:

declare class X {
    /**
      * Cancels the request, sending a cancellation to the other party
      * @param {Object} error __auto_generated__
      * @param {string?} error.reason the error reason to send the cancellation with
      * @param {string?} error.code the error code to send the cancellation with
      * @returns {Promise.<*>} resolves when the event has been sent.
      */
    cancel({ reason, code }?: {
        reason: string;
        code: string;
    }): Promise<any>;
}

New output (invalid):

declare class X {
    /**
      * Cancels the request, sending a cancellation to the other party
      * @param {Object} error __auto_generated__
      * @param {string?} error.reason the error reason to send the cancellation with
      * @param {string?} error.code the error code to send the cancellation with
      * @returns {Promise.<*>} resolves when the event has been sent.
      */
    cancel({ reason, code }?: 
     * @param {?string} error.reason the error reason to send the cancellation with
     * @param {?string} error.code the error code to send the cancellation with
    ): Promise<any>;
}

Activity

  1. Jack-Works commented on May 6, 2020

    @Jack-Works
    ContributorAuthor

    Another problem:

    /**
     * @param {Array} x
     */
    function x(x) {}
    /**
     * @param {Promise} x
     */
    function y(x) {}

    In 3.9.0 beta:

    /**
     * @param {Array} x
     */
    declare function x(x: any[]): void;
    /**
     * @param {Promise} x
     */
    declare function y(x: Promise<any>): void;

    In nightly:

    /**
     * @param {Array} x
     */
    declare function x(x: Array): void;
    /**
     * @param {Promise} x
     */
    declare function y(x: Promise): void;

    Notice the missing generics make it invalid

  2. DanielRosenwasser commented on May 6, 2020

    @DanielRosenwasser
    Member

    Wesley Wigham (@weswigham) this is a 3.9 regression - I think it'd be best to just never reuse type nodes if they come from a JS file.

  3. weswigham commented on May 6, 2020

    @weswigham
    Member

    Daniel Rosenwasser (@DanielRosenwasser) too late - #38368 has the fix. We have code explicitly mapping jsdoc constructs to ts type constructs, it was just missing the jsdoc object literal form, and didn't account for how we allow missing type parameters (even without defaults) in JS.

  4. DanielRosenwasser commented on May 6, 2020

    @DanielRosenwasser
    Member

    My fear is just that there's another case we haven't covered. The assumption is that TS types are always "well formed" for declaration emit, but JS nodes aren't. As long as we're confident that there aren't other cases that we've missed, #38368 should be sufficient.

  5. weswigham commented on May 6, 2020

    @weswigham
    Member

    As we add support for more jsdoc forms, we should check that we actually support declaration emit for those forms, same as we do for TS type nodes. If we could exhaustively check for node kinds so it's typesystem enforced, I would, but, ah, something something, compiler performance compiling itself is still kinda bad when Node is a union of all possible kinds?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Domain: Declaration EmitThe issue relates to the emission of d.ts filesDomain: JavaScriptThe issue relates to JavaScript specificallyDomain: LS: Type DisplayBugs relating to showing types in Quick Info/Tooltips, Signature Help, or Completion InfoNeeds InvestigationThis issue needs a team member to investigate its status.

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions