mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-26 09:19:04 -05:00
Merge pull request #17254 from Microsoft/generic-Object-jsdoc-creates-index-signature
JSDoc:Object<string, T> creates index signature
This commit is contained in:
@@ -6870,8 +6870,19 @@ namespace ts {
|
||||
return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference;
|
||||
}
|
||||
|
||||
function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type {
|
||||
function getIntendedTypeFromJSDocTypeReference(node: TypeReferenceNode): Type {
|
||||
if (isIdentifier(node.typeName)) {
|
||||
if (node.typeName.text === "Object") {
|
||||
if (node.typeArguments && node.typeArguments.length === 2) {
|
||||
const indexed = getTypeFromTypeNode(node.typeArguments[0]);
|
||||
const target = getTypeFromTypeNode(node.typeArguments[1]);
|
||||
const index = createIndexInfo(target, /*isReadonly*/ false);
|
||||
if (indexed === stringType || indexed === numberType) {
|
||||
return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index);
|
||||
}
|
||||
}
|
||||
return anyType;
|
||||
}
|
||||
switch (node.typeName.text) {
|
||||
case "String":
|
||||
return stringType;
|
||||
@@ -6885,8 +6896,6 @@ namespace ts {
|
||||
return undefinedType;
|
||||
case "Null":
|
||||
return nullType;
|
||||
case "Object":
|
||||
return anyType;
|
||||
case "Function":
|
||||
case "function":
|
||||
return globalFunctionType;
|
||||
@@ -6912,7 +6921,7 @@ namespace ts {
|
||||
let type: Type;
|
||||
let meaning = SymbolFlags.Type;
|
||||
if (isJSDocTypeReference(node)) {
|
||||
type = getPrimitiveTypeFromJSDocTypeReference(node);
|
||||
type = getIntendedTypeFromJSDocTypeReference(node);
|
||||
meaning |= SymbolFlags.Value;
|
||||
}
|
||||
if (!type) {
|
||||
|
||||
13
tests/baselines/reference/jsdocIndexSignature.symbols
Normal file
13
tests/baselines/reference/jsdocIndexSignature.symbols
Normal file
@@ -0,0 +1,13 @@
|
||||
=== tests/cases/conformance/jsdoc/indices.js ===
|
||||
/** @type {Object.<string, number>} */
|
||||
var o1;
|
||||
>o1 : Symbol(o1, Decl(indices.js, 1, 3))
|
||||
|
||||
/** @type {Object.<number, boolean>} */
|
||||
var o2;
|
||||
>o2 : Symbol(o2, Decl(indices.js, 3, 3))
|
||||
|
||||
/** @type {Object.<boolean, string>} */
|
||||
var o3;
|
||||
>o3 : Symbol(o3, Decl(indices.js, 5, 3))
|
||||
|
||||
13
tests/baselines/reference/jsdocIndexSignature.types
Normal file
13
tests/baselines/reference/jsdocIndexSignature.types
Normal file
@@ -0,0 +1,13 @@
|
||||
=== tests/cases/conformance/jsdoc/indices.js ===
|
||||
/** @type {Object.<string, number>} */
|
||||
var o1;
|
||||
>o1 : { [x: string]: number; }
|
||||
|
||||
/** @type {Object.<number, boolean>} */
|
||||
var o2;
|
||||
>o2 : { [x: number]: boolean; }
|
||||
|
||||
/** @type {Object.<boolean, string>} */
|
||||
var o3;
|
||||
>o3 : any
|
||||
|
||||
10
tests/cases/conformance/jsdoc/jsdocIndexSignature.ts
Normal file
10
tests/cases/conformance/jsdoc/jsdocIndexSignature.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
// @allowJs: true
|
||||
// @checkJs: true
|
||||
// @noEmit: true
|
||||
// @Filename: indices.js
|
||||
/** @type {Object.<string, number>} */
|
||||
var o1;
|
||||
/** @type {Object.<number, boolean>} */
|
||||
var o2;
|
||||
/** @type {Object.<boolean, string>} */
|
||||
var o3;
|
||||
Reference in New Issue
Block a user