Update type-only import semantics to allow type queries (#36092)

* Change type-only semantics to allow type queries

* Don’t error using type-only import in ambient context

* Fix default import

* Fix namespace import

* Update more baselines

* Prevent circular resolution

* Track const enum expression usage

* Update baselines

* Perf tuning 1

* Test commit for perf impact

* Weave type-only alias declaration finding into alias resolution

* Fix namespace import of type-only exported symbols

* type-only exports do not contribute to the module object type

* Update APIs

* Fix enum casing, remove type-only conversion suggestion

* Short circuit type-only checks in resolveEntityName faster

* Fix casing in API

* Remove unused parameter

* Fix error on qualified names in type queries

* Allow type-only imports in computed property names

* Fix computed property names of types and abstract members

* Remove unused util

* Commit missing baselines

* Rename “check” functions so as not to overload the word “check”
This commit is contained in:
Andrew Branch
2020-01-23 12:53:36 -08:00
committed by GitHub
parent 0276e7f910
commit b05dde747c
76 changed files with 1406 additions and 326 deletions

View File

@@ -0,0 +1,9 @@
// @Filename: /a.ts
export class A { a!: string }
// @Filename: /b.ts
import type { A } from './a';
declare class B extends A {}
declare namespace ns {
class C extends A {}
}

View File

@@ -0,0 +1,19 @@
// @Filename: /a.ts
class A { a!: string }
export type { A as default };
// @Filename: /b.ts
import A from './a';
import type { default as B } from './a';
export { A, B };
// @Filename: /c.ts
import * as types from './b';
export { types as default };
// @Filename: /d.ts
import types from './c';
new types.A();
new types.B();
const a: types.A = {};
const b: types.B = {};

View File

@@ -0,0 +1,43 @@
// @target: esnext
// @Filename: framework-hooks.ts
export const onInit = Symbol("onInit");
// @Filename: component.ts
import type { onInit } from "./framework-hooks";
interface Component {
[onInit]?(): void;
}
type T = {
[onInit]: any;
}
const o = {
[onInit]: 0 // Error
};
class C {
[onInit]: any; // Error (because class fields)
}
class D {
[onInit] = 0; // Error
}
class E {
[onInit]() {} // Error
}
abstract class F {
abstract [onInit](): void;
}
class G {
declare [onInit]: any;
}
declare class H {
[onInit]: any;
}

View File

@@ -5,6 +5,7 @@
export default class {}
export class A {}
export type B = {};
export const enum C { One, Two }
// @Filename: /b.ts
import { A, B } from './a'; // Error
@@ -26,3 +27,17 @@ console.log(a, b);
// @Filename: /e.ts
import { A, B } from './a'; // noUnusedLocals error only
// @Filename: /f.ts
import { C } from './a';
import type { C as D } from './a';
C.One;
let c: D = C.Two;
let d: D.Two = C.Two;
console.log(c, d);
// @Filename: /g.ts
import { C } from './a';
let c: C;
let d: C.Two;
console.log(c, d);

View File

@@ -0,0 +1,9 @@
// @Filename: /a.ts
class A {}
export type { A };
export class B {};
// @Filename: /b.ts
import * as types from './a';
let A: typeof types.A;
let B: typeof types.B;

View File

@@ -0,0 +1,8 @@
// @Filename: /a.ts
class A { a!: string }
export type { A };
// @Filename: /b.ts
import * as types from './a';
types.A;
const { A } = types;

View File

@@ -0,0 +1,6 @@
// @Filename: /a.ts
export class A { }
// @Filename: /b.ts
import type { A } from './a';
let AConstructor: typeof A;