11import ts , { TypeFlags } from "typescript" ;
22import { ParserState } from "./ParserState" ;
3- import { newHelperTypeName } from "./newHelperTypeName" ;
3+ import {
4+ newHashedHelperTypeName ,
5+ newIndexedHelperTypeName ,
6+ } from "./newHelperTypeName" ;
47import { parseTypeDefinition } from "./parseTypeDefinition" ;
58import { getCanonicalTypeName } from "./canonicalTypeName" ;
69
@@ -72,9 +75,20 @@ export const tryToParseInlineType = (
7275 // there is no way to represent template literals in Python,
7376 // so we fallback to string
7477 return "str" ;
75- } else if ( type . flags & TypeFlags . ESSymbol ) {
76- state . imports . add ( "Any" ) ;
77- return "Any" ;
78+ } else if ( type . flags & TypeFlags . ESSymbolLike ) {
79+ const knownType = state . knownTypes . get ( type ) ;
80+ if ( state . knownTypes . has ( type ) ) {
81+ return knownType ;
82+ } else {
83+ // we must create a new type to represent the symbol
84+ state . imports . add ( "NewType" ) ;
85+ const name = newIndexedHelperTypeName ( state , type , "symbol" ) ;
86+ state . statements . push (
87+ `${ name } = NewType(${ JSON . stringify ( name ) } , object)` ,
88+ ) ;
89+ state . knownTypes . set ( type , name ) ;
90+ return name ;
91+ }
7892 } else {
7993 // assume interface or object, we need to create a helper type
8094 if ( ! globalScope ) {
@@ -85,7 +99,7 @@ export const tryToParseInlineType = (
8599 return semanticallyIdenticalType ;
86100 } else {
87101 // we must create a new type
88- const helperName = newHelperTypeName ( state , type ) ;
102+ const helperName = newHashedHelperTypeName ( state , type ) ;
89103 parseTypeDefinition ( state , helperName , type ) ;
90104 state . knownTypes . set ( canonicalName , helperName ) ;
91105 return helperName ;
0 commit comments