kanfutrooper
@kanfutrooper (masaomi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

TypeScriptのエラーを解消したい

TypeScriptのc文法を勉強しています。
下記3ヶ所にエラーの表示が出ます。
調べてエラーが改善しません。
何方か改善方法を教えてください。

エラーが表示
① 29行 this._obj[key] = val;
Index signature in type 'String' only permits reading.
② 61行目 if (wrappedObj1.obj.a === '01') {
Property 'a' does not exist on type 'string'.
③ 70行目wrappedObj1.obj.b === '04'
Property 'b' does not exist on type 'string'.

class ObjectWrapper {
  private _obj;

  /***
   * 引数のオブジェクトのコピーを this._objに設定
   */
  //変更前 constructor(_obj: Object) {}
  constructor(_obj: Object) {
    this._obj = _obj;
  }
  /**
   * this._objのコピーを返却
   * @return Object
   */
  //変更前 get obj() {}

  get obj() {
    return this._obj;
  }
  /**
   * this._obj[key] に valを設定。keyがthis._objに存在しない場合、falseを返却
   * @param key オブジェクトのキー
   * @param val オブジェクトの値
   */
  //変更前set(key, val): boolean {}

  set(key: any, val: string): boolean {
    if (this._obj[key] !== undefined) {
      console.log(typeof this._obj);
      console.log(typeof key);
      this._obj[key] = val;   // ① Index signature in type 'String' only permits reading. エラーが表示
      return true;
    }
    return false;
}

  /**
   * 指定したキーの値のコピーを返却
   * 指定のキーが存在しない場合 undefinedを返却
   * @param key オブジェクトのキー
   */
  //変更前get(key) {}

  get(key: any) {
    return this._obj;
  }
  /**
   * 指定した値を持つkeyの配列を返却。該当のものがなければ空の配列を返却。
   */
  //findKeys(val: unknown) {}

  findKeys(val: unknown): unknown[] {
    return keys;
  }
}

/**
 * check script
 * 完成したら、以下のスクリプトがすべてOKになる。
 */

const obj1 = { a: '01', b: '02' };

const wrappedObj1 = new ObjectWrapper(obj1);

if (wrappedObj1.obj.a === '01') {  //②Property 'a' does not exist on type 'string'.  エラーが表示
  console.log('OK: get obj()');
} else {
  console.error('NG: get obj()');
}

if (
  wrappedObj1.set('c', '03') === false &&
  wrappedObj1.set('b', '04') === true &&
wrappedObj1.obj.b === '04'                 //③Property 'b' does not exist on type 'string'.   エラーが表示
) {
  console.log('OK: set(key, val)');
} else {
  console.error('NG: set(key, val)');
}

if (wrappedObj1.get('b') === '04' && wrappedObj1.get('c') === undefined) {
  console.log('OK: get(key)');
} else {
  console.error('NG: get(key)');
}

const obj2 = { a: '01', b: '02', bb: '02', bbb: '02' };
const wrappedObj2 = new ObjectWrapper(obj2);
const keys = wrappedObj2.findKeys('02');
if (
  wrappedObj2.findKeys('03').length === 0 &&
  keys.includes('b') &&
  keys.includes('bb') &&
  keys.includes('bbb') &&
  keys.length === 3
) {
  console.log('OK: findKeys(val)');
} else {
  console.error('NG: findKeys(val)');
}
0

1Answer

c文法というものが分かりませんが(クラスのことですか?)、単純に

constructor(_obj: Object) {
  this._obj = 'Object';
}

これが原因だと思います。(オブジェクトを代入すべき場所にObjectという文字列を代入している?)

クラスの前にオブジェクトについて学ぶほうが理解が進むと思います。

0Like

Comments

  1. @kanfutrooper

    Questioner

    @_y_s さん、ご指摘ありがとうございます。
    もう一度、確認し訂正します
    アドバイス、本当にありがとうございました!

Your answer might help someone💌