在 TypeScript 中推断对象的接口

Rod*_*igo 5 module initialization interface typescript

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

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

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

问题是我将所有字段都输入两次,这不仅很无聊,而且还容易出错

我无法真正使用return <Foo>{};,因为有些对象是其他对象的成员,所以我会丢失属性并undefined弹出。

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

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

Tit*_*mir 4

您可以反转键入Foo和 函数的方式,并且可以Foo是 的返回类型newFoo

export type  Foo = ReturnType<typeof newFoo>

export function newFoo() {
    return {
        name: '',
        surname: '',
        cars: 0
    };
};
Run Code Online (Sandbox Code Playgroud)

如果您希望某些成员是可选的或不由其初始化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
    });
};
Run Code Online (Sandbox Code Playgroud)