我正在尝试在打字稿中创建一个对象。 我想一般这样做,以便根据其类型
自动获取默认值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);
}
}
但我认为这不会起作用
答案 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 {})
请注意,使用此方法时content
和count
不是abstract
,所以虽然您仍然可以使用BaseModel进行类型检查,但是如果您需要强制子类提供自己的值,那么仍然可以创建一个界面来清除默认值:
class SomeModel extends BaseModel {} // OK
interface IModel extends BaseModel {}
class SomeModel implements IModel {} // NOT OK: Property 'content' is missing