Ответ 1
Если у вас есть такой интерфейс, как:
interface ISimpleObject {
foo: string;
bar?: any;
}
Этот интерфейс используется только во время компиляции и для подсказки кода /intellisense. Интерфейсы используются для обеспечения строгого и безопасного типа использования объекта с определенной сигнатурой в согласованном порядке.
Если у вас есть функция с использованием interface
, определенной выше:
function start(config: ISimpleObject):void {
}
Компиляция TypeScript завершится неудачно, если объект не имеет точной подписи интерфейса ISimpleObject
.
Существует несколько допустимых методов вызова функции start
:
// matches the interface as there is a foo property
start({foo: 'hello'});
// Type assertion -- intellisense will "know" that this is an ISimpleObject
// but it not necessary as shown above to assert the type
var x = <ISimpleObject> { foo: 'hello' };
start(x);
// the type was inferred by declaration of variable type
var x : ISimpleObject = { foo: 'hello' };
start(x);
// the signature matches ... intellisense won't treat the variable x
// as anything but an object with a property of foo.
var x = { foo: 'hello' };
start(x);
// and a class option:
class Simple implements ISimpleObject {
constructor (public foo: string, public bar?: any) {
// automatically creates properties for foo and bar
}
}
start(new Simple("hello"));
Всякий раз, когда подпись не соответствует, компиляция завершится неудачно:
// compile fail
var bad = { foobar: 'bad' };
start( bad );
// compile fail
var bad: ISimpleObject = { foobar: 'bad' };
// and so on.
Нет никакого "правильного" способа сделать это. Это вопрос выбора стиля. Если бы это был объект, который был сконструирован (а не просто передан непосредственно как параметр), я бы обычно объявлял тип:
var config: ISimpleObject = { foo: 'hello' };
Таким образом, выполнение кода /IntelliSense будет работать везде, где я использовал переменную config
:
config.bar = { extra: '2014' };
В TypeScript нет "кастинга". Он называется утверждением типа и не должен нуждаться в описанных здесь случаях (я включил пример выше, где он может быть использован). Нет необходимости объявлять переменную Type, а затем использовать утверждение в этом случае (поскольку тип уже был известен).