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

如何在TypeScript实现时解析TypeWithDynamicValue的value联合类型

如何让TypeScript类型的value字段自动推导为具体类型(无需泛型/satisfies)

问题背景

我定义了一个TypeWithDynamicValue类型,其中value字段限制为string | boolean | number联合类型。但在声明实现时,希望value的类型能自动解析为具体类型(比如传入数字就推导为number),且不需要开发者手动指定泛型或使用satisfies关键字。

当前直接使用类型注解的问题:

type TypeWithDynamicValue = {
  foo: string;
  bar: boolean;
  value: string | boolean | number;
}

const implementation: TypeWithDynamicValue = {
  foo: 'fizz',
  bar: false,
  value: 59
};
type ValueTypeResult = typeof implementation.value; // 结果仍是 string | boolean | number,而非预期的 number

现有方案的局限

曾尝试将类型拆分为交叉联合的形式,配合泛型函数推导具体类型,在同一文件内有效,但跨文件导入实现时会失效——因为TypeScript在同一文件内会应用控制流分析后的类型,而跨文件时只会使用类型注解中声明的原始联合类型。

可行解决方案:利用infer工具类型+泛型辅助函数

通过泛型辅助函数来包裹实现的创建过程,结合infer提取具体类型,能解决跨文件类型推导失效的问题,同时满足无需手动指定泛型或satisfies的需求。

类型定义与辅助函数(types.ts)

// 定义基础公共结构
type BaseType = {
  foo: string;
  bar: boolean;
};

// 原目标类型
export type TypeWithDynamicValue = BaseType & {
  value: string | number | boolean;
};

// 工具类型:从TypeWithDynamicValue中提取value的具体类型
type ExtractValue<T extends TypeWithDynamicValue> = T extends BaseType & { value: infer V } ? V : never;

// 泛型辅助函数:自动推导传入对象的具体类型
export function createImplementation<T extends TypeWithDynamicValue>(impl: T): T {
  return impl;
}

跨文件使用示例(other-file.ts)

import { createImplementation } from './types';

// 无需手动指定泛型或使用satisfies,自动推导类型
const implementation = createImplementation({
  foo: 'fizz',
  bar: false,
  value: 59
});

type ValueTypeResult = typeof implementation.value; // 结果为 number,符合预期

原理说明

泛型辅助函数createImplementation会在调用时自动推导传入对象的完整具体类型,即使跨文件导入,TypeScript也会保留这个推导后的类型信息,而非回退到原始的联合类型。infer工具类型则可以精准提取出value字段的具体类型,满足类型推导的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:40:18