如何解决打字稿-从模块导入的打字稿中的任何一种
我有类似的东西:
import * as Types from '../schema/types';
我想做类似的事情:
let a: Types;
指示a
必须是从types.ts
导出的多种类型之一。我怎样才能做到这一点? (是的是graphql服务器)
解决方法
看起来您打算使用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文件中构造并集类型,然后在主文件中使用它们。
我想不出一种自动执行此操作的方法,但是您需要的是union type。
假设您在../schema/types
中声明了以下类型:
interface Foo {
...
}
interface Bar {
...
}
已导入import * as Types from '../schema/types';
您可以创建一个联合类型,例如:
type GqType = Types.Bar | Types.Foo;
然后您可以像这样创建a
:
let a: GqType;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。