いつもお世話になります。
TypeScriptの型推論について、ご教示いただければ幸いです。
前提・実現したいこと
TypeScript 4.3を利用しています。
異なるオブジェクト同士(objA, objB)でキー名を比較して、同一キー名の型が同じ時のみ、
片側のオブジェクトにもう片方のプロパティを代入する良い書き方があればご教示いただけませんでしょうか。
片側のオブジェクトのkeyで回した時、どうしてもnever型で推論してしまい、エラーになってしまいます。
発生している問題・エラーメッセージ
Type 'string' is not assignable to type 'never'.
エラーその2
こちらは、baseClass のidに readonlyを付けた場合、当該エラー箇所が id が入ることを示唆していてエラーとなる。
このことで、当該箇所でプロパティの絞り込みができていないと考えています。
Cannot assign to 'id' because it is a read-only property.
該当のソースコード
TypeScript
1class baseClass { 2 constructor(id: number,name: string ,name2: string){ 3 this.id = id 4 this.name = name 5 this.name2 = name2 6 } 7 id:number 8 name:string 9 name2:string 10} 11const baseClassInstance = new baseClass(0,"","") 12baseClassInstance.id = 123 13baseClassInstance.name = "base name" 14baseClassInstance.name2 = "base name 2" 15 16const forInput = { 17 id: 789, 18 name2: "input 2", 19 name10 : "input 10", 20} 21 22Object.keys(forInput) 23 .forEach(key => { 24 if (typeof baseClassInstance[key as keyof typeof baseClassInstance] === "string" && 25 typeof forInput[key as keyof typeof forInput] === "string" 26 ) { 27 console.log(key) 28 console.log(forInput[key as keyof typeof forInput]) 29 console.log(typeof forInput[key as keyof typeof forInput]) 30 console.log(baseClassInstance[key as keyof typeof baseClassInstance]) 31 console.log(typeof baseClassInstance[key as keyof typeof baseClassInstance]) 32 33 // 以下のような挙動を取りたい 34 // baseClassInstance["name2"] = forInput["name2"] 35 baseClassInstance[key as keyof typeof baseClassInstance] = forInput[key as keyof typeof forInput] 36 //ops... Type 'string' is not assignable to type 'never'. 37 } 38 }) 39 40//期待する結果 41//forInput の name2だけが string型で共通するので、そのプロパティが書き換わっている 42console.log(baseClassInstance) 43// baseClass: { 44// "id": 123, 45// "name": "base name", 46// "name2": "input 2" 47// }
試したこと
エラーを無視すれば実行時に動くのですが、もっと正しい示唆の仕方がないのかなと悩んでいます。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/22 00:25
退会済みユーザー
2021/10/22 16:19