You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:25:15