在TypeScript中,可以使用索引类型和条件类型来约束对象的键和值。
要在推断值的同时约束TypeScript对象的键,可以使用索引类型。索引类型允许我们根据对象的键来获取相应的值类型。通过定义索引类型,可以约束对象的键必须属于特定的类型。
以下是如何在推断值的同时约束TypeScript对象的键的示例代码:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const user = { id: 1, name: 'John' };
const id = getProperty(user, 'id'); // 推断为 number 类型
const name = getProperty(user, 'name'); // 推断为 string 类型
const age = getProperty(user, 'age'); // 编译错误,age 不是 user 对象的键
在上面的示例中,getProperty
函数接受一个对象和一个键,并根据键从对象中获取相应的值。通过使用 keyof T
,我们将键约束为对象 T
的有效键。返回值类型 T[K]
则表示对象 T
中键 K
对应的值类型。
如果要同时约束键和值,可以使用条件类型。条件类型允许我们基于类型判断来选择不同的结果类型。
以下是如何在推断值的同时约束TypeScript对象的键和值的示例代码:
type ObjectWithKeyAndValue<T, K extends keyof T, V> = K extends keyof T ? Record<K, V> : never;
function createObjectWithKeyAndValue<T, K extends keyof T, V>(obj: T, key: K, value: V): ObjectWithKeyAndValue<T, K, V> {
return { [key]: value } as ObjectWithKeyAndValue<T, K, V>;
}
const user = { id: 1, name: 'John' };
const updatedUser = createObjectWithKeyAndValue(user, 'id', 2); // 返回 { id: 2 }
const newUser = createObjectWithKeyAndValue(user, 'age', 25); // 编译错误,age 不是 user 对象的键
在上面的示例中,我们定义了一个 ObjectWithKeyAndValue
条件类型,根据键 K
是否属于对象 T
的键来选择返回类型。如果键 K
是对象 T
的键,则返回一个具有键 K
和值类型 V
的对象类型,否则返回 never
类型。createObjectWithKeyAndValue
函数使用这个条件类型,根据给定的键和值创建一个新的对象。
领取专属 10元无门槛券
手把手带您无忧上云