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

TypeScript:如何限制类型下界并保留精确字面量类型?

实现单一函数的解决方案

可以通过定义带双重泛型约束的函数实现,无需中间调用:

type Foo = {
  foo: string;
}

const requireSubtype = <U, T extends U>(o: T): T => o;

// 正确示例:推断类型为{ foo: string; bar: string; },保留bar属性
const fooLike = requireSubtype<Foo, _>({ foo: "foo", bar: "bar" });
fooLike.bar; // 类型检查通过

// 错误示例:缺少foo属性,类型检查报错
requireSubtype<Foo, _>({ bar: "bar" });

其中_是TypeScript 4.7+支持的推断占位符,用于让编译器自动推断第二个泛型参数T的类型。若你的TS版本低于4.7,可省略第二个泛型参数,编译器仍会自动完成推断:

// TS 4.7以下兼容写法
const fooLike = requireSubtype<Foo>({ foo: "foo", bar: "bar" });
纯类型约束实现(无运行时函数)

如果希望完全通过类型系统实现、无运行时开销,可使用TypeScript 4.9+支持的satisfies关键字:

type Foo = {
  foo: string;
}

// 约束对象符合Foo类型,同时保留原对象的精确字面量类型
const fooLike = { foo: "foo", bar: "bar" } satisfies Foo;
fooLike.bar; // 类型检查通过

// 错误示例:缺少foo属性,类型检查报错
const invalidFoo = { bar: "bar" } satisfies Foo;

satisfies的核心作用是确保表达式符合指定类型,但不会覆盖表达式自身的推断类型,完美匹配「约束子类型+保留精确类型」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:17