在 TypeScript 中推断对象的接口

Infer the interface of an object in TypeScript

假设我在模块中有一个 TypeScript 接口,还有一个 return 该接口的初始化对象的函数:

export default interface Foo {
    name: string;
    surname: string;
    cars: number;
};

export function newFoo(): foo {
    return <Foo>{
        name: '',
        surname: '',
        cars: 0
    };
};

问题是我在所有字段中输入了两次,这不仅无聊,而且容易出错

我不能真正使用 return <Foo>{}; 因为有些情况下对象是其他对象的成员,所以我会缺少属性并且 undefined 弹出。

我可以在调用它时检查 属性 是否存在,但是由于 属性 没有 ?,这意味着它是强制性的,所以它应该在那里.

那么,上面的代码有没有更好的写法呢?

您可以反转输入 Foo 和函数的方式,让 Foo 成为 newFoo 的 return 类型:

export type  Foo = ReturnType<typeof newFoo>

export function newFoo() {
    return {
        name: '',
        surname: '',
        cars: 0
    };
};

如果您希望某些成员是可选的或不由 newFoo 初始化,您将不得不做一些工作来添加它们,尽管这对于复杂的场景来说可能有点过分:

export type  Foo = ReturnType<typeof newFoo>

export function newFoo() {
    const optionalInitiazlised = {
        optionaButInited: ""
    }

    return  Object.assign(optionalInitiazlised as Partial<typeof optionalInitiazlised>,
        {} as { optionalProp?: string }, {
        name: '',
        surname: '',
        cars: 0
    });
};