2016-09-14 6 views
2

Я не знаю, когда использовать это:объекта по сравнению с литым буквального объекта в машинописном

interface IFoo 
{ 
    bar: string; 
} 

... 

let array: IFoo[]; 

array.push(<IFoo>{ bar: "test" }); 

Или

class Foo 
{ 
    bar: string; 
} 

... 

let array: Foo[]; 
let obj = new Foo(); 

obj.bar = "test"; 

array.push(obj); 

Ths Дело в том, что я иду из C# мира и я, это чище сделать второй способ, но также соблазнительно использовать первый способ, хотя он не такой строгий, как второй вариант. Поэтому я действительно борется, на данный момент у меня просто возникает ощущение, что я могу использовать тот, который я хочу, но я уверен, что для них есть плюсы и минусы. К сожалению, я не нашел ничего в google.

Благодаря

+0

Почему вы бросаете в первом примере? Это необязательно –

+0

Это действительно так, но вопрос остается в силе ;-) – ssougnez

+2

Если вы просто хотите иметь объект со свойствами, то перейдите к первому параметру с интерфейсом, но если вы хотите иметь методы для этого объекта, тогда перейдите к классу –

ответ

2

В javascript мы фактически не имеем классов, а только простые объекты * («хэш-таблицы» -y) с прототипом функциональности. Функции - это какой-то объект (с небольшим синтаксическим сахаром поверх него).

* (не академически правильно говорит, и скрывая некоторые вещи)

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

var parent = { 
    method1: function() { return 1 } , 
    method2: function() { return 2 } 
} 
var child = Object.create(parent) 
child.method2 = function() { return '2a' } 

child.__proto__ //shows parent 
parent.__proto__ //shows Object (the "root class") 
child.method3() //undefined is not a function 
child.method2() //2a, not 2 
child.method1() //method1 not found, looks at __proto__, returns 1 
child.toString  
//looks at child, not found 
//looks at child.__proto__ (parent), not found 
//looks at child.__proto__.__proto__ (Object), returns function 

Какие классы (от ES2015 и transpilers) примерно сделать чтобы убрать немного кода, который вы должны были бы написать, чтобы получить поведение/стиль программирования class с других языков, начиная с объектов и прототипов.

В ES2015 объявление класса создает объект «prototype», а new (или Object.create **) создает объект «экземпляр», который наследует этот propotype.

Теперь вернусь к машинописи ...

var a : { b : string } 
a.b = '4' 

{ b : string } только аннотация. Он входит в сферу типов. Скажем, в машинописном тексте у нас есть 2 сферы, область конкретных переменных, которые попадают в сгенерированный код; и область типов, которые используются исключительно для помощи/линтирования, но не будут в конечном итоге в реальном JS. { b : string } можно ссылаться прочь используя либо interface или type синтаксис

type Ta = { b : string } //or 
interface Ta { b : string } 
var a : Ta 

объявляя аннотации типа (которые включают в себя интерфейсы) Добавить нулевой код в конкретной области JS.

..on С другой стороны, когда вы используете class, машинопись создает как

  • конкретный код JS (а именно объект прототип)
  • , а также пару жителей типа царства.

TL; DR:

Теперь к ответу, нет большой проблемы в любом из 2-х способов, но с использованием интерфейсов (и меньше классов) склоняется к наиболее распространенному яваскрипту стилю кодирования. Некоторые школы JS выступают против использования классов, поскольку вы можете в основном добиться такого же эффекта с помощью других моделей.

+0

Хорошо, поэтому допустимым подходом было бы использование классов, когда мне нужны расширенные объекты, содержащие методы и простой объект, когда это не так? Спасибо за объяснение :-P – ssougnez

+1

в основном подобный. Чем проще, тем лучше. –

+0

Круто, спасибо большое ;-) – ssougnez

0

Я думаю, что оба примера не получится, потому что вы не инициализирует значение array, просто объявить тип для него. Вы должны инициализировать это что-то вроде этого:

let array : Array<IFoo> = []; 
array.push({bar: "test" }); 

Преимущество использования класса не становятся существенными, пока вы не определите некоторые другие члены его, как методы или вычисляемых свойств. В этом случае вы хотели бы использовать new Foo(...).

+0

Подробнее см. Http://stackoverflow.com/questions/12764247/typescript-interface-vs-class-vs-modules-vs-program-vs-function –

+0

Действительно, я забыл инициализацию. Это потому, что я набрал там код напрямую и не тестировал его ;-) – ssougnez

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