ウェブサイト検索

javascript - 要素には暗黙的に 'any' 型が割り当てられています。タイプ 'User1' には、パラメータの型が 'string' のインデックスシグネチャが見つかりませんでした


TypeScriptで計算プロパティを使おうとしましたが、次のエラーが出ます:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'User1'.
  No index signature with a parameter of type 'string' was found on type 'User1'

コード:

type User1 = {
  name: string;
  age: number;
  address: string;
};

const user1: User1 = {
  name: "user1",
  age: 23,
  address: "address",
};

let checkParameter: string | number = "name";
console.log(user1[checkParameter]); //error occurring here

checkParameter = "age";
console.log(user1[checkParameter]); //error occurring here

checkParameter = "address";
console.log(user1[checkParameter]); //error occurring here

checkParameter はランダムで、実行時に決定されます。

私はエラーなしで実行されることを期待しています。

回答 #1

型 User1 が string 型のキーを持つプロパティを持つことを指定するには、[key: string]: string を追加できます

type User1  = {
   [key: string]: string;
   name: string;
   age: number;
   address: string;
};

const user1: User1 = {
   name: "user1",
   age: 23,
   address: "address",
};

let checkParameter: string | number = "name";
console.log(user1[checkParameter]);

<code>checkParameter</code>は<code>string | number</code>の2つの型を持ち、キーを指すので、もしUser1型がnumber型のキーを持つ場合、この型をキーに追加します:

type User1  = {
   [key: string | number]: string
   name: string;
   age: number;
   address: string;
};

回答 #2

1つの解決策は、checkParameter の型を各プロパティを表す文字列のユニオンに変更することです。let checkParameter: "name" | "age" | "address"="name"

更新: @jcalz が提案したように、keyof User1 は User1 のプロパティを動的に表します:

type User1 = {
  name: string;
  age: number;
  address: string;
};

const user1: User1 = {
  name: "User 1",
  age: 23,
  address: "123 First St",
};

let checkParameter: keyof User1 = "name";
console.log(user1[checkParameter]); // User 1

checkParameter = "age";
console.log(user1[checkParameter]); // 23

checkParameter = "address";
console.log(user1[checkParameter]); // 123 First St