“对象”上不存在如何绕过属性的问题

我刚接触打字机,不知道这个问题怎么用词。

我需要访问构造函数中传递的对象的两个“可能”属性。我知道我错过了一些检查,看看他们是否定义,但类型是抛给我一个“属性不存在于‘对象’”消息。消息出现在 选择器上,模板返回。

class View {
public options:Object = {};


constructor(options:Object) {
this.options = options;
}


selector ():string {
return this.options.selector;
}


template ():string {
return this.options.template;
}


render ():void {


}
}

我相信它相当简单,但是对我来说 Typecript 是新的。

100044 次浏览

如果使用 any类型而不是 Object,则可以访问任何属性而不会出现编译错误。

但是,我建议创建一个接口来标记该对象的可能属性:

interface Options {
selector?: string
template?: string
}

因为所有字段都使用 ?:,这意味着它们可能在那里,也可能不在那里:

function doStuff(o: Options) {
//...
}


doStuff({}) // empty object
doStuff({ selector: "foo" }) // just one of the possible properties
doStuff({ selector: "foo", template: "bar" }) // all props

如果有些东西来自 javascript,你可以这样做:

import isObject from 'lodash/isObject'


const myOptions: Options = isObject(somethingFromJS) // if an object
? (somethingFromJS as Options) // cast it
: {} // else create an empty object


doStuff(myOptions) // this works now

当然,只有当您不确定是否存在非其类型的属性时,此解决方案才能按预期的方式工作。

如果不想更改类型或创建接口,也可以使用此语法访问未知属性:

selector ():string {
return this.options["selector"];
}


template ():string {
return this.options["template"];
}