打字稿-从模块导入的打字稿中的任何一种

时间:2020-08-20 20:25:19

标签: typescript graphql

我有类似的东西:

import * as Types from '../schema/types';

我想做类似的事情:

let a: Types;

指示a必须是从types.ts导出的多种类型之一。我怎样才能做到这一点? (是的是graphql服务器)

2 个答案:

答案 0 :(得分:1)

看起来您打算使用union types。对于打字稿union types,您可以参考以下示例示例-

方案1:在其他模块中构造单个类型,并在使用过程中使用并集:

types.ts

type a = {
    name: string;
}

type b ={
    name: number;
}

export type {a, b}

您可以像这样使用它:

import {a,b} from './types';

let a: a|b;

import * as types from './types';

let a: types.a|types.b;

方案2:在其他模块中构造联合类型并在调用方中使用:

types.ts

type a = {
    name: string;
}

type b ={
    id: string;
}

export type types = a|b

使用

import {types}  from './types';

let a: types;

要在graphql中使用联合类型,请使用上述示例here-

更新:看到有关获取所有类型的注释后,答案为interfacestypes属于type space世界中根本不存在的JS之下,它们只是对象具有特定结构的编译器提示。换句话说,您甚至无法像在Object.Keys/ Object.entries中那样通过classes.从模块中获取所有类型并对其进行分配,这些甚至在运行时都不存在。

最好的选择是将它们从模块中提取出来,并转换为union types或在types.ts文件中构造并集类型,然后在主文件中使用它们。

答案 1 :(得分:0)

我想不出一种自动执行此操作的方法,但是您需要的是union type

假设您在../schema/types中声明了以下类型:

interface Foo {
 ...
}

interface Bar {
 ...
}

已导入import * as Types from '../schema/types';

您可以创建一个联合类型,例如:

type GqType = Types.Bar | Types.Foo;

然后您可以像这样创建a

let a: GqType;