我的打字稿水平是'ABSOLUTE BEGINNER',但我有一个很好的OOP背景。我正在使用typescript来构建一个引用包含以下接口的外部t.ds
库:
interface ISimpleObject {
foo: string;
bar?: any;
}
现在,如果我想调用具有IRequestConfig参数的方法,我该如何创建一个?我可以看到不同的选择:
不要初始化对象(我担心这会破坏某些东西......):
var x :IsimpleObject;
x.bar = 'xxx';
callMethod(x);
施放pojo:
var x :IsimpleObject = <IsimpleObject>{foo: 'yyy', bar:'xxx'};
我不喜欢这种方法,因为它没有强制实施类型安全......
我想这是一个相当微不足道的问题,我遗漏了一些关于打字稿的小事。
答案 0 :(得分:44)
Typescript2:
const simpleObject = {} as ISimpleObject;
答案 1 :(得分:35)
如果您有如下界面:
interface ISimpleObject {
foo: string;
bar?: any;
}
此接口仅在编译时和代码提示/智能感知中使用。接口用于提供严格且类型安全的方式,以一致的方式使用具有已定义签名的对象。
如果您使用上面定义的interface
功能:
function start(config: ISimpleObject):void {
}
如果对象没有ISimpleObject
接口的确切签名,则TypeScript编译将失败。
调用函数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's 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.
没有&#34;对&#34;这样做的方式。这是风格选择的问题。如果它是一个被构造的对象(而不是直接作为参数传递),我通常会声明类型:
var config: ISimpleObject = { foo: 'hello' };
这样,代码完成/ IntelliSense可以在我使用config
变量的任何地方工作:
config.bar = { extra: '2014' };
没有&#34;铸造&#34;在TypeScript中。它被称为类型断言,在这里描述的情况下不应该需要(我在上面包含了一个可以使用它的例子)。在这种情况下,没有必要声明变量Type然后使用断言(因为类型已经知道)。
答案 2 :(得分:2)
您无法创建接口实例,因为Typescript不会将其“转换”为js。您可以检查创建的js,您将看不到任何内容。编译错误,类型安全和智能感知很简单。
interface IStackOverFlow
{
prop1 : string;
prop2 : number;
}
public MyFunc(obj : IStackOverFlow)
{
// do stuff
}
var obj = {prop1: 'str', prop2: 3};
MyFunc(obj); // ok
var obj2 = {prop1: 'str'};
MyFunc(obj); // error, you are missing prop2
// getObj returns a "any" type but you can cast it to IStackOverFlow.
// This is just an example.
var obj = <IStackOverFlow> getObj();