bugfix> typescript > 投稿

Itemというオブジェクトがあり、そのフィールドを含むインターフェイスと、変更および定義できるフィールドの配列を定義しました。 ユーザーがアイテムを更新したい場合、ユーザーは更新されたアイテムを含むPOSTリクエストを送信します。私は配列を調べて、ユーザーのデータに従ってフィールドを更新します。 問題は、Typescriptがエラーをスローすることです。 タイプ '文字列|番号 'はタイプ'決して 'に割り当てることはできません。 タイプ「string」はタイプ「never」に割り当てることができません。ts(2322)

この件について何か助けていただければ幸いです

interface Item {
    id?: number;
    title?: string;
    price?: number;
}
const requiredItemFields: Array<keyof Item> = [
    "title",
    "price",
]
app.post('/update-item', (req, res) => {
    const existItem: Item = req.body.item;
    const newItem: Item = {};
    for (let filed of requiredItemFields) {
        if (existItem.hasOwnProperty(filed)) {
            newItem[filed] = existItem[filed]; << ERROR
        }
    }
})

Typescriptプレイグラウンド

回答 1 件
  • 事はtypescriptがあなたが思うほど賢くないということです。

    あなたがするとき:

    newItem[filed] = existItem[filed];
    
    

    typescriptはそれを想定していません newItem[filed] と同じタイプになります existItem[filed]

    それに、 existItem[filed] アイテムキーの背後にある任意のタイプにすることができます。

    私が言っていることの検証として、以下が機能していることがわかります:

    newItem[filed as 'id'] = existItem[filed as 'id'];
    
    

    どのような解決策がありますか?

    「私は自分が何をしているのか知っています。これらの2つの値は同じタイプです」という影響を受け入れるようにtypescriptを強制します。

    newItem[filed] = existItem[filed] as any;
    
    

    または

    // @ts-ignore
    newItem[filed] = existItem[filed];
    
    

あなたの答え