在 Typescript 中从一种类型转换为另一种类型的最佳实践方法

Roa*_*ers 7 typescript

如果我有 2 个接口:

interface Person{
    name: string;
}

interface Employee extends Person{
    employeeId: string;
}
Run Code Online (Sandbox Code Playgroud)

我想将 Person 转换为 en Employee:

function employPerson(person: Person, id: string): Employee
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?

我认为这样做的标准方法是:

function employPerson(person: Person, id: string): Employee{
    const employee = person as Employee

    employee.employeeId = id;

    return employee;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但这也有效:

function employPerson(person: Person, id: string): Employee{
    const employee = person as Employee

    return employee;
}
Run Code Online (Sandbox Code Playgroud)

这显然是不对的。

我喜欢这种方法:

function employPerson(person: Person, id: string): Employee{
    return {
        ...person,
        employeeId: id
    };
}
Run Code Online (Sandbox Code Playgroud)

这确保我们拥有所有正确的属性,如果我更改Employee界面以添加新属性,上述代码将正确出错。问题在于我返回了一个不同的对象——它是一个克隆。

如何在仍然使用完整类型安全的同时向现有对象添加属性?

谢谢

Rod*_*ris 6

怎么样Object.assign

function employPerson(person: Person, id: string): Employee {
    return Object.assign(person, {
        employeeId: id
    });
}
Run Code Online (Sandbox Code Playgroud)