Когда нужно использовать интерфейс и не класс (и наоборот)?

Когда мы программируем с Typescript, у нас есть концепция, которая не существует в Javascript: интерфейсы. В ES6 есть классы, которые являются синтаксическим сахаром для классического prototipado, но нет tipado переменных и ничего, похожего на интерфейс.

Один может думать, что интерфейсы - то же самое, что и в Java или C#, но я встретился с этим:

class MiClase {

  constructor( public atributoA: string) {}

  metodoA() {
    //hace algo
  }
}

interface MiInterfaz extends MiClase {
    algo: any;
}

function miFuncion(attr: MiClase) {
  console.log(attr instanceof MiClase);
}

function miFuncion2(attr: MiInterfaz) {
  console.log(attr instanceof MiClase);
}

let a = {
    atributoA: 'hola',
    atributoB: 6,
    metodoA: function () { },
};


miFuncion(a); //false
miFuncion2(a);//false

let b = new MiClase('Una auténtica instancia de MiClase');

miFuncion(b); //true
miFuncion2(b);//compilador marca error, no cumple la interfaz

Что тут происходит?

  • Почему a он не дает ошибку, использовав ее в miFuncion когда он ясно не класса MiClase?
  • Почему они взаимозаменяемые? Интерфейс увеличивает класс и не дает ошибку!
8
задан 07.03.2019, 17:59
0 ответов