获取命名空间的键并使用括号访问命名空间成员

Syl*_*ler 8 typescript typescript-typings

如何从文件中导入所有类型而不更改它(如test.ts下面的文件),并通过括号语法访问它们?

测试.ts

export type TEST1 = 'test1'
export type TEST2 = 'test2'
export type TEST3 = 'test3'
export type TEST4 = 'test4'
Run Code Online (Sandbox Code Playgroud)

索引.ts

import type * as T from './test'

const a: T.TEST1 = 'test1' // what i can do
type B = 'TEST2' | 'TEST3' // subset of available types in test.ts
const b: T[B] = 'test2' // what i want to do

Run Code Online (Sandbox Code Playgroud)

nii*_*oah 2

乍一看文档,这似乎是不可能的,但我想我已经弄清楚了。对于您在示例中显示的特定场景,其中类型是字符串文字,您可以使用可索引类型映射类型的组合,如下所示:

test.ts

type TYPES = 'test1' | 'test2' | 'test3' | 'test4';

type MAPPED = {
  [key in TYPES]: TYPES;
}

type TYPE = {
  TEST1: 'test1',
  TEST2: 'test2',
  TEST3: 'test3',
  TEST4: 'test4'
}

type T = MAPPED & TYPE;

export default T;
Run Code Online (Sandbox Code Playgroud)

index.ts

import type T from './test';

type b = 'TEST2' | 'TEST3';
const b: T[b] = 'test1';
Run Code Online (Sandbox Code Playgroud)

第二行将显示错误:

类型“test1”不可分配给类型“test2”| “测试3”'。您的意思是“test2”吗?

这证明这是按预期工作的。