概要
react
でtypescript
を用いた環境でWeb開発を行っており、JSONファイルをimportしてコード上で加工したうえで出力するようなものを作成しています。
JSONからimportしたオブジェクトについて、扱いが難しいのでお知恵をいただければと思います。
コードと症状
/src/reference/testData.json
json
1[ 2 { 3 "name" : "Alice", 4 "gender" : "2" 5 }, 6 { 7 "name" : "Bob", 8 "gender" : "1" 9 }, 10 { 11 "name" : "Charlie" 12 } 13]
/src/App.tsx
typescript
1import React from 'react'; 2import jsonObj from './reference/testData.json' 3 4type tJSON = { 5 name : string, 6 gender?: "1" | "2" 7} 8 9const people1:tJSON[] = jsonObj; 10 11const people2:tJSON[] = jsonObj.filter((people)=>{ 12 if(! ("gender" in people)) return true; 13 if(people.gender === "1") return true; 14 if(people.gender === "2") return true; 15 return false; 16});
上記コードを入力すると、VSCode上でconst people1で下記エラー
型 '({ name: string; gender: string; } | { name: string; gender?: undefined; })[]' を型 'tJSON[]' に割り当てることはできません。 型 '{ name: string; gender: string; } | { name: string; gender?: undefined; }' を型 'tJSON' に割り当てることはできません。 型 '{ name: string; gender: string; }' を型 'tJSON' に割り当てることはできません。 プロパティ 'gender' の型に互換性がありません。 型 'string' を型 '"2" | "1" | undefined' に割り当てることはできません。
const people2で下記エラーが発生します。
型 '({ name: string; gender: string; } | { name: string; gender?: undefined; })[]' を型 'tJSON[]' に割り当てることはできません。
環境
- os:windows 10
- editor: Visual Studio Code 1.50.1
- reactやnode,babelなどのバージョンは必要があれば調べますが、本日
$npx create-react-app test-app --template typescript
で新規構築したフォルダでほかの開発をせずに上記のみで作業しましたので、私のtypescriptの知識不足だと考えています。
希望する解決策
tsconfig.json
上で"resolveJsonModule": true
が指定されています。そのため自動で型が推測され、jsonObj
のgender
の型がstring|undefined
で推測されているため、'1'|'2'|undefined
と競合していると考えています。
しかしアプリ側の都合でこちらの制限はかけたいため、下記の解決策のいずれかを希望します。
- jsonに型定義を自前で登録して使用する。
- JSONからinportしたオブジェクトを別オブジェクトに移す際にfilterなどで適用することをtypescript側に通知する
1番目についてはTypeScriptでJSONファイルを型付きで読み込む(Qiita)などを参考にしてやってみたのですが、うまく適用されませんでした。
2番目についてはperson2
が私の認識ですが、こちらもうまくいっていないです。
以上、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー