質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

1回答

4109閲覧

Vue3 (TypeScript) の型エラーがテンプレート内で発生します。

Privater

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2021/11/15 10:01

前提・実現したいこと

Vue3 の型定義で VS Code によるエラーが出ます。
エラーが出ないようにするにはどうすれば良いでしょうか?

config/app.tsから読み込んだオブジェクトを、composable/useAppState.tsの関数で返し、views/Home.vue テンプレートで表示する処理です。
views/Home.vueの {{ appState.name }} で以下のエラーが表示されました。

発生している問題・エラーメッセージ

オブジェクト型は 'unknown' です。 ts(2571)
エラーメッセージ

該当のソースコード

types/App.ts

TypeScript

1export interface App { 2 name: string 3}

config/app.ts

TypeScript

1import { App } from '@/types/App' 2 3export const app:Readonly<App> = Object.freeze({ 4 name: 'アプリケーション名' 5})

composable/useAppState.ts

TypeScript

1import { computed } from 'vue' 2import { app } from '@/config/app' 3 4export const useAppState = (): Record<string, unknown> => { 5 const appState = computed(() => { 6 return app 7 }) 8 9 return { appState } 10}

views/Home.vue

Vue

1<template> 2 <div>{{ appState.name }}</div> 3</template> 4 5<script lang="ts> 6import { defineComponent } from 'vue' 7import { useAppState } from '@/composable/useAppState' 8 9export default defineComponent({ 10 setup () { 11 const { appState } = useAppState() 12 13 return { 14 appState 15 } 16 } 17}) 18</script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

私はTypeScriptには明るくないのですが、推測で回答させていただきます。
appStateのプロパティはunknown型となっているので、本来は型のキャストをしなければ参照時にコンパイルエラーとなります。
事実console.log(appState.name)などと書いたら即エラーになりました。
ですが実際はvue自体のコードはTSのコンパイルの対象外であるため、その配下でパースされるテンプレート上では型判定エラーが起きずに普通に動作しているものと思われます。

このままではエディタ上の表示だけでなく、TSコードの他の部分でもコンパイルに支障がで可能性があります。
そこで回避策として以下のuseAppStateの定義部分に関して、

export const useAppState = (): Record<string, unknown> => {
  • unknownanyにする
  • 型を明確にRecord<string, Record<string, any>>(あるいは{ appState: Record<string, any> }等)にする
  • 厳密に自作のAppState型にする

以上のいずれかを行えば問題は解消すると思います。

投稿2021/11/16 03:13

編集2021/11/16 03:13
surface_0

総合スコア497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問