getTypeFromJSDocValueReference: handle import types (#34683)

Previously it only handled types whose declaration was from `require`,
but now it handles types whose reference is an import type as well.
This commit is contained in:
Nathan Shively-Sanders 2019-10-23 15:53:38 -07:00 committed by GitHub
parent eb08ee6848
commit 8223c07527
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 2 deletions

View File

@ -10754,7 +10754,7 @@ namespace ts {
/**
* A JSdoc TypeReference may be to a value, but resolve it as a type anyway.
* Note: If the value is imported from commonjs, it should really be an alias,
* but this function fakes special-case code fakes alias resolution as well.
* but this function's special-case code fakes alias resolution as well.
*/
function getTypeFromJSDocValueReference(node: NodeWithTypeArguments, symbol: Symbol): Type | undefined {
const valueType = getTypeOfSymbol(symbol);
@ -10766,7 +10766,7 @@ namespace ts {
&& isCallExpression(decl.initializer)
&& isRequireCall(decl.initializer, /*requireStringLiteralLikeArgument*/ true)
&& valueType.symbol;
if (isRequireAlias) {
if (isRequireAlias || node.kind === SyntaxKind.ImportType) {
typeType = getTypeReferenceType(node, valueType.symbol);
}
}

View File

@ -0,0 +1,28 @@
=== tests/cases/conformance/jsdoc/mod1.js ===
class C {
>C : Symbol(C, Decl(mod1.js, 0, 0))
s() { }
>s : Symbol(C.s, Decl(mod1.js, 0, 9))
}
module.exports.C = C
>module.exports.C : Symbol(C, Decl(mod1.js, 2, 1))
>module.exports : Symbol(C, Decl(mod1.js, 2, 1))
>module : Symbol(module, Decl(mod1.js, 2, 1))
>exports : Symbol("tests/cases/conformance/jsdoc/mod1", Decl(mod1.js, 0, 0))
>C : Symbol(C, Decl(mod1.js, 2, 1))
>C : Symbol(C, Decl(mod1.js, 0, 0))
=== tests/cases/conformance/jsdoc/test.js ===
/** @typedef {import('./mod1').C} X */
/** @param {X} c */
function demo(c) {
>demo : Symbol(demo, Decl(test.js, 0, 0))
>c : Symbol(c, Decl(test.js, 2, 14))
c.s
>c.s : Symbol(C.s, Decl(mod1.js, 0, 9))
>c : Symbol(c, Decl(test.js, 2, 14))
>s : Symbol(C.s, Decl(mod1.js, 0, 9))
}

View File

@ -0,0 +1,29 @@
=== tests/cases/conformance/jsdoc/mod1.js ===
class C {
>C : C
s() { }
>s : () => void
}
module.exports.C = C
>module.exports.C = C : typeof C
>module.exports.C : typeof C
>module.exports : typeof import("tests/cases/conformance/jsdoc/mod1")
>module : { "tests/cases/conformance/jsdoc/mod1": typeof import("tests/cases/conformance/jsdoc/mod1"); }
>exports : typeof import("tests/cases/conformance/jsdoc/mod1")
>C : typeof C
>C : typeof C
=== tests/cases/conformance/jsdoc/test.js ===
/** @typedef {import('./mod1').C} X */
/** @param {X} c */
function demo(c) {
>demo : (c: C) => void
>c : C
c.s
>c.s : () => void
>c : C
>s : () => void
}

View File

@ -0,0 +1,15 @@
// @noEmit: true
// @allowJs: true
// @checkJs: true
// @Filename: mod1.js
class C {
s() { }
}
module.exports.C = C
// @Filename: test.js
/** @typedef {import('./mod1').C} X */
/** @param {X} c */
function demo(c) {
c.s
}