我有类似的东西:
import * as Types from '../schema/types';
我想做类似的事情:
let a: Types;
指示a
必须是从types.ts
导出的多种类型之一。我怎样才能做到这一点? (是的是graphql服务器)
答案 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
-
更新:看到有关获取所有类型的注释后,答案为否。 interfaces
和types
属于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;