web-dev-qa-db-ja.com

プロパティを回避する方法が「オブジェクト」に存在しません

私は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は私にとって新しいものです。

49
Eric Harms

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

もちろん、このソリューションは、タイプではなくプロパティの存在について確信がない場合にのみ期待どおりに機能します。

58
Balázs Édes

タイプを変更したりインターフェイスを作成したくない場合は、次の構文を使用して不明なプロパティにアクセスすることもできます。

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

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