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
