TypeScript中如何为对象属性定义基于另一个属性值的类型约束?

在思否上看到有人提问这样一个问题,比如现在有下面的类型:
type Foo = {
type: 'string' | 'number',
value: string | number
}
如果我想要 value 的类型在type为 'string' 时为 string ,在 type 为 'number' 的时候为 number。
要怎么定义这两个属性之间的类型约束?
在 TypeScript 中,我们可以使用联合类型(Union Types)与类型守卫(Type Guards)或者更直接地,使用条件类型(Conditional Types)和映射类型(Mapped Types,虽然在这个特定场景中不直接需要)来定义两个属性之间的类型约束。但是,对于你想要的直接类型定义,最简洁的方式是使用 TypeScript 的条件类型(也称为分发条件类型或泛型条件类型)来定义一个新的类型。
下面是如何使用条件类型来定义你的 Foo 类型,使得 value 的类型根据 type 的值动态变化:
type Foo<T extends 'string' | 'number'> = {
type: T,
value: T extends 'string' ? string : number
};
// 使用示例
const fooString: Foo<'string'> = {
type: 'string',
value: 'Hello, World!', // 正确
// value: 123, // 错误,如果取消注释,TypeScript 会报错
};
const fooNumber: Foo<'number'> = {
type: 'number',
value: 42, // 正确
// value: 'Hello', // 错误,如果取消注释,TypeScript 会报错
};
在这个例子中,我们定义了一个泛型类型 Foo<T>,其中 T 是 'string' 或 'number' 的一个约束。然后,我们使用条件类型来定义 value 的类型,使其根据 T 的值而变化。如果 T 是 'string',则 value 是 string 类型;如果 T 是 'number',则 value 是 number 类型。
这种方式提供了类型安全,并且允许你根据 type 属性的值来精确控制 value 属性的类型。这是 TypeScript 中处理基于属性的类型变化的一种非常强大和灵活的方式。
以上关于TypeScript中如何为对象属性定义基于另一个属性值的类型约束?的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » TypeScript中如何为对象属性定义基于另一个属性值的类型约束?
微信
支付宝