/
propertyTypes.ts
36 lines (32 loc) · 1.04 KB
/
propertyTypes.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import type * as tsType from 'typescript';
export function getTypeOfPropertyOfName(
checker: tsType.TypeChecker,
type: tsType.Type,
name: string,
escapedName?: tsType.__String,
): tsType.Type | undefined {
// Most names are directly usable in the checker and aren't different from escaped names
if (!escapedName || !name.startsWith('__')) {
return checker.getTypeOfPropertyOfType(type, name);
}
// Symbolic names may differ in their escaped name compared to their human-readable name
// https://github.com/typescript-eslint/typescript-eslint/issues/2143
const escapedProperty = type
.getProperties()
.find(property => property.escapedName === escapedName);
return escapedProperty
? checker.getDeclaredTypeOfSymbol(escapedProperty)
: undefined;
}
export function getTypeOfPropertyOfType(
checker: tsType.TypeChecker,
type: tsType.Type,
property: tsType.Symbol,
): tsType.Type | undefined {
return getTypeOfPropertyOfName(
checker,
type,
property.getName(),
property.getEscapedName(),
);
}