1. ホーム
  2. typescript

[解決済み] TypeScriptで Object.keys return string[].

2022-07-05 07:48:37

質問

を使用する場合 Object.keys(obj) を使うと、返り値は string[] であるのに対し、私は (keyof obj)[] .

const v = {
    a: 1,
    b: 2
}

Object.keys(v).reduce((accumulator, current) => {
    accumulator.push(v[current]);
    return accumulator;
}, []);

エラーが出ています。

type '{ a: number; b: number; }' にはインデックス署名がないため、要素は暗黙的に 'any' 型を持っています。

TypeScript 3.1では strict: true . 遊び場です。 ここで のすべてのチェックボックスをチェックしてください。 Options を有効にしてください。 strict: true .

どのように解決するのですか?

Object.keysstring[] . これは、次のように設計されています。 問題

<ブロッククオート

これは意図的なものです。TSの型はオープンエンドです。そのため、keysofは実行時に取得するすべてのプロパティより少なくなる可能性が高いです。

いくつかの解決策がありますが、最も単純なものは単に型アサーションを使用することです。

const v = {
    a: 1,
    b: 2
};

var values = (Object.keys(v) as Array<keyof typeof v>).reduce((accumulator, current) => {
    accumulator.push(v[current]);
    return accumulator;
}, [] as (typeof v[keyof typeof v])[]);

のエイリアスを作成することもできます。 keys の中に Object を使うと、望みの型が返されます。

export const v = {
    a: 1,
    b: 2
};

declare global {
    interface ObjectConstructor {
        typedKeys<T>(obj: T): Array<keyof T>
    }
}
Object.typedKeys = Object.keys as any

var values = Object.typedKeys(v).reduce((accumulator, current) => {
    accumulator.push(v[current]);
    return accumulator;
}, [] as (typeof v[keyof typeof v])[]);