如何在TypeScript中不依赖单独列表检索指定name的Foo接口实现?
能否直接检索TypeScript接口的所有实现并过滤?
答案是不行。TypeScript的类型系统仅作用于编译阶段,编译为JavaScript后,所有类型注解会被完全擦除——运行时不存在任何关于Foo接口的信息,自然无法通过接口类型定位所有标注为Foo的常量。
可行替代方案
1. 用对象集中管理实例
不需要单独维护数组,用一个对象作为容器存放所有Foo实例,后续遍历对象值即可过滤:
interface Foo { readonly name: string; }; const FooStore = { FOO_1: { name: 'zing' } as Foo, FOO_2: { name: 'baz' } as Foo }; const getFooByName = (targetName: string): Foo | undefined => { return Object.values(FooStore).find(foo => foo.name === targetName); }; console.log(getFooByName('zing')); // 输出 { name: 'zing' }
2. 自动注册机制
创建实例时将其加入模块级注册表,无需手动维护列表:
interface Foo { readonly name: string; }; const fooRegistry: Foo[] = []; const registerFoo = (foo: Foo): Foo => { fooRegistry.push(foo); return foo; }; // 创建实例时自动注册 const FOO_1 = registerFoo({ name: 'zing' } as Foo); const FOO_2 = registerFoo({ name: 'baz' } as Foo); const getFooByName = (targetName: string): Foo | undefined => { return fooRegistry.find(foo => foo.name === targetName); }; console.log(getFooByName('zing')); // 返回FOO_1对应的对象
不推荐的方案:遍历全局变量
虽然可以在Node.js遍历global、浏览器遍历window,检查对象是否有name属性,但这种方法存在严重问题:
- 无法区分
Foo实例和普通带name属性的对象 - 遍历全局变量性能差、风险高
- 无TypeScript类型安全保障
因此强烈不建议使用。
内容的提问来源于stack exchange,提问作者user3029486
相关产品推荐
相关产品推荐

