打字稿创建通用对象

时间:2017-05-23 01:16:34

标签: javascript generics typescript

我正在尝试在打字稿中创建一个对象。 我想一般这样做,以便根据其类型

自动获取默认值
interface IModal {
    content: string;
    count: number
 }

通常我会像这样声明一个实例:

var modal: IModal = {
    content: '',
    count: 0
};

我不想每次都这样做。我想这样做,以便它自动创建一个具有Typed默认值的接口实例,即

number = 0,
string = '',
boolean = false,
MyCustom = new MyCustom

我想做这样的事情:

export class MakeObject {

     Make<T> : T = function(iInterface) => {
        return default(T);
     }     
}

但我认为这不会起作用

2 个答案:

答案 0 :(得分:3)

  

我想这样做,以便它自动创建一个具有Typed默认值的接口实例,即

由于接口在运行时不存在,因此无法神奇地执行此操作。也就是说你可以编写代码来轻松完成这项工作:

interface Model {
    content: string;
    count: number
}

function createModel({
    // Add defaults
    content = '',
    count = 0
} = {}): Model {
    return { content, count }
}

createModel(); // Okay
createModel({ count: 1 }); // Okay
createModel({ counted: 1 }); // Error: Typo

答案 1 :(得分:3)

接口可以extends个类,所以你可以这样做:

class DefaultModel {
    content = ''
    count = 0
}

export interface IModel extends DefaultModel {}
/* since interface generates no code,
 * you can also export the default instance using the same name, if you like
 */
export const IModel: IModel = new DefaultModel
// or export the default class, if you're more interested in it
export const IModel = DefaultModel

另一种方法,如果你不反对类,使用abstract类,在typescript中它们像接口一样灵活(例如:可与type互换)并且在运行时存在:< / p>

abstract class BaseModel {
    content = ''
    count = 0
}

const modal = new (class extends BaseModel {})

请注意,使用此方法时contentcount不是abstract,所以虽然您仍然可以使用BaseModel进行类型检查,但是如果您需要强制子类提供自己的值,那么仍然可以创建一个界面来清除默认值:

class SomeModel extends BaseModel {} // OK    

interface IModel extends BaseModel {}

class SomeModel implements IModel {} // NOT OK: Property 'content' is missing