2015-09-30 4 views
3

Я новичок в написании сценария, просто просматривая их учебник и пробовав кодирование на игровой площадке, но обнаружил что-то странное.Любые причины для ввода интерфейса для класса?

Например, этот код:

class foobar implements Ifoobar 
{ 
    full: string; 
    constructor (public foo, public bar) 
    { 
     this.full = foo + bar; 
    } 
} 

interface Ifoobar 
{ 
    foo: string; 
    bar: string; 
} 

function test(ifoobar: Ifoobar) 
{ 
    return ifoobar.foo + ifoobar.bar; 
} 

var obj = new foobar("hello", "world"); 


document.body.innerHTML = test(obj); 

работает, если вы положили

class foobar implements Ifoobar 

или просто

class foobar 

так, что это точка, используя интерфейс, если сам договор не соблюдается?

UPDATE Моя главная задача на самом деле на этой линии:

document.body.innerHTML = test(obj); 

это должно бросить ошибку прямо так Foobar не использует реализует Ifoobar и тест (ifoobar: Ifoobar), как указано в аргументе метода должен принимать только Ifoobar. Для меня это похоже на машинопись просто ясно, что foobar реализует Ifoobar, хотя это не так.

+0

Как вы оцениваете сценарий? Какой процесс вы используете для его сборки/проверки? – Dai

+0

@ Дай Я еще не построил/не проверил его, все еще на http://www.typescriptlang.org/Playground и пробовал вещи или два. – kirie

+0

Это основное использование для 'implements ifoobar': http://bit.ly/1FHmopN - это поможет вам убедиться, что Ifoobar имеет правильную структуру (а также предоставляет другим разработчикам информацию об использовании класса« foobar », обеспечивая при этом совместимость с интерфейсом с течением времени). – Fenton

ответ

3

TypeScript использует duck typing, что означает, что если элементы соответствуют, типы считаются совместимыми. Вот почему код остается в силе после удаления implements Ifoobar - a foobar можно рассматривать как Ifoobar, так как он имеет все члены, объявленные Ifoobar.

И TypeScript обеспечивает соблюдение контракта. Если вы удалите/переименуете любой из членов foo или bar, компилятор будет генерировать ошибки.

1

какой смысл использовать интерфейс, если сам контракт не был приведен в исполнение

Свы насильственном во время компиляции, например следующий сбой компиляции (потому что я удалил public из bar):

class foobar implements Ifoobar // ERROR property `bar` is missing in foobar 
{ 
    full: string; 
    constructor (public foo, bar) 
    { 
     this.full = foo + bar; 
    } 
} 

interface Ifoobar 
{ 
    foo: string; 
    bar: string; 
} 

Это действительно для класса автора (не потребителя), чтобы гарантировать, что они следуют за контракт (interface).

Больше

Пожалуйста, обратите внимание, что типы структурирования в машинописи и компилировать Неудача не означает, что Js не будет. См. why typescript

Смежные вопросы