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

如何在TypeScript中实现类似Swift的元类型功能,将类型作为值使用

TypeScript 对应 Swift 元类型功能的实现方案

TypeScript 的类型仅存在于编译阶段,运行时会被完全擦除,没有原生和 Swift Value.Type 完全对等的元类型,我们可以通过以下三种常见方案实现需求:

方案1:基于构造函数实现(无第三方依赖)

对应你给出的 Swift 代码的最简等价实现如下:

类型定义

// 泛型描述类,对应Swift的RecordDescriptor<Value>
interface RecordDescriptor<Value> {
  key: string;
  // 这里的构造函数类型对应Swift的Value.Type,代表Value类型的构造器
  valueType: new (...args: any[]) => Value;
}

// 取值方法,返回值类型和Descriptor的泛型绑定
function fetchValue<Value>(descriptor: RecordDescriptor<Value>): Value {
  // 这里替换为你自己的数据源取值逻辑
  const rawValue = getRawValueFromDataSource(descriptor.key);
  // 用传入的构造函数实例化对应类型的值
  return new descriptor.valueType(rawValue) as Value;
}

使用示例

// 定义Int类型的描述实例,对应Swift的RecordDescriptor(key: "int_record", valueType: Int.self)
const intRecordDescriptor: RecordDescriptor<number> = {
  key: "int_record",
  valueType: Number
};

// intValue自动推导为number类型
const intValue = fetchValue(intRecordDescriptor);

方案2:基于运行时校验库实现(更灵活,支持自定义接口类型)

如果需要支持没有对应构造函数的自定义对象/接口类型,推荐用 Zod 这类运行时类型校验库实现,同时能获得运行时类型校验能力,避免数据源返回值类型不符合预期的问题:

实现代码

import { z } from "zod";

interface RecordDescriptor<Value> {
  key: string;
  // Zod的Schema对象同时关联编译时类型和运行时校验逻辑
  schema: z.Schema<Value>;
}

function fetchValue<Value>(descriptor: RecordDescriptor<Value>): Value {
  const rawValue = getRawValueFromDataSource(descriptor.key);
  // 自动执行运行时类型校验,不符合预期会直接抛出明确错误
  return descriptor.schema.parse(rawValue);
}

使用示例

// 基础类型使用
const intRecordDescriptor: RecordDescriptor<number> = {
  key: "int_record",
  schema: z.number()
};
const intValue = fetchValue(intRecordDescriptor); // 类型推导为number

// 自定义对象类型使用
const userSchema = z.object({
  id: z.number(),
  name: z.string()
});
const userRecordDescriptor: RecordDescriptor<z.infer<typeof userSchema>> = {
  key: "user_record",
  schema: userSchema
};
// user自动推导为 {id: number, name: string} 类型
const user = fetchValue(userRecordDescriptor);

最简轻量化方案(仅需编译时类型标注)

如果你不需要运行时类型校验,只需要编译阶段的类型推导,可以省略运行时的类型参数,直接显式指定泛型即可:

interface RecordDescriptor<Value> {
  key: string;
}

function fetchValue<Value>(descriptor: RecordDescriptor<Value>): Value {
  return getRawValueFromDataSource(descriptor.key) as Value;
}

// 直接指定泛型参数完成特化
const intValue = fetchValue<number>({ key: "int_record" });

内容的提问来源于stack exchange,提问作者Yakov Manshin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:07