在TypeScript中推断对象的接口

5
假设我有一个TypeScript接口在一个模块中,还有一个返回初始化对象的函数,该对象符合该接口定义:
export default interface Foo {
    name: string;
    surname: string;
    cars: number;
};

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

问题在于我需要将所有字段重复输入两次,这不仅极其无聊,而且也容易出现错误
我不能真正使用return <Foo>{};,因为有些对象是其他对象的成员,所以我会缺少属性并且出现undefined
我可以在调用属性时检查属性是否存在,但由于该属性没有?,这意味着它必须存在,所以应该存在。
那么,有更好的编写上述代码的方法吗?
1个回答

4
你可以改变输入参数 Foo 和函数的位置,让 Foo 变为 newFoo 函数的返回类型。
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
    });
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接