Eu acho que você tem basicamente cinco opções diferentes para fazer isso. Escolher entre eles pode ser fácil, dependendo do objetivo que você deseja alcançar.
A melhor maneira, na maioria dos casos, de usar uma classe e instancia-la , porque você está usando o TypeScript para aplicar a verificação de tipo.
interface IModal {
content: string;
form: string;
//...
//Extra
foo: (bar: string): void;
}
class Modal implements IModal {
content: string;
form: string;
foo(param: string): void {
}
}
Mesmo que outros métodos ofereçam maneiras mais fáceis de criar um objeto a partir de uma interface, considere dividir sua interface , se você estiver usando seu objeto para assuntos diferentes e isso não causar excesso de segregação de interface:
interface IBehaviour {
//Extra
foo(param: string): void;
}
interface IModal extends IBehaviour{
content: string;
form: string;
//...
}
Por outro lado, por exemplo, durante o teste unitário de seu código (se você não aplicar a separação de preocupações com frequência), poderá aceitar as desvantagens por uma questão de produtividade. Você pode aplicar outros métodos para criar simulações principalmente para grandes interfaces de terceiros * .d.ts. E pode ser difícil implementar sempre objetos anônimos completos para todas as interfaces enormes.
Nesse caminho, sua primeira opção é criar um objeto vazio :
var modal = <IModal>{};
Em segundo lugar, para realizar plenamente a parte obrigatória da sua interface . Pode ser útil se você estiver chamando bibliotecas JavaScript de terceiros, mas acho que você deve criar uma classe, como antes:
var modal: IModal = {
content: '',
form: '',
//...
foo: (param: string): void => {
}
};
Terceiro, você pode criar apenas uma parte da sua interface e criar um objeto anônimo , mas dessa forma você é responsável por cumprir o contrato
var modal: IModal = <any>{
foo: (param: string): void => {
}
};
Resumindo minha resposta, mesmo que as interfaces sejam opcionais, porque não são transpiladas para o código JavaScript, o TypeScript existe para fornecer um novo nível de abstração, se usado com sabedoria e consistência. Eu acho que só porque você pode descartá-los na maioria dos casos do seu próprio código, não deveria.