繁体   English   中英

在 TypeScript 中推断对象的接口

[英]Infer the interface of an object in TypeScript

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

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任何返回类型:

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
    });
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM