私はTypeScriptを初めて使用しますが、この質問をどのように表現するかわかりません。
コンストラクターで渡されるオブジェクトの2つの「可能な」プロパティにアクセスする必要があります。定義されているかどうかを確認するためのいくつかのチェックが欠落していることは知っていますが、TypeScriptから「 'Object'にプロパティが存在しません」というメッセージが表示されます。メッセージはselectorおよびtemplateで返されます。
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 {
}
}
かなりシンプルだと思いますが、TypeScriptは私にとって新しいものです。
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
? (<Options> somethingFromJS) // cast it
: {} // else create an empty object
doStuff(myOptions) // this works now
もちろん、このソリューションは、タイプではなくプロパティの存在について確信がない場合にのみ期待どおりに機能します。
タイプを変更したりインターフェイスを作成したくない場合は、次の構文を使用して不明なプロパティにアクセスすることもできます。
selector ():string {
return this.options["selector"];
}
template ():string {
return this.options["template"];
}