下面是一个示例代码,展示了如何编写一个assoc函数以正确推断新类型:
type Person = {
name: string;
age: number;
};
type Student = {
name: string;
age: number;
grade: string;
};
function assoc(obj: T, key: K, value: T[K]): T {
return {
...obj,
[key]: value,
};
}
const person: Person = {
name: "John",
age: 25,
};
const updatedPerson = assoc(person, "age", 30);
console.log(updatedPerson); // { name: 'John', age: 30 }
const student: Student = {
name: "Alice",
age: 20,
grade: "A",
};
const updatedStudent = assoc(student, "grade", "B");
console.log(updatedStudent); // { name: 'Alice', age: 20, grade: 'B' }
在这个示例中,我们定义了一个assoc函数,它接受三个参数:一个对象obj,一个键key,一个值value。函数的类型参数T表示传入对象的类型,而类型参数K表示对象的键的类型,它必须是T的键之一。
在函数体内部,我们使用了扩展运算符(...)来复制传入的对象obj,并在新对象上设置键值对[key]: value。通过这种方式,我们确保了返回的对象类型与传入的对象类型相同。
通过使用类型参数和泛型约束,我们可以确保assoc函数正确推断新类型,并且在使用时会进行类型检查。