小道具のタイプに注釈を付ける
使用するとき
1 2 3 4 5 6 7 8 9 |
<script setup lang= "ts" > const props = defineProps({
foo: { type: String, required: true }, bar: Number }) props.foo // string props.bar // number | undefined </script> |
これは、defineProps() に渡される引数が実行時 props オプションとして使用されるため、実行時宣言と呼ばれます。
2 番目の方法は、ジェネリック パラメーターを使用して props のタイプを定義する方法で、より直接的です。
1 2 3 4 5 6 |
<script setup lang= "ts" > const props = defineProps<{
foo: string bar?: number }>() </script> |
これは型ベースの宣言と呼ばれ、コンパイラは可能な限り型パラメータに基づいて同等の実行時オプションを導出しようとします。
props タイプを別のインターフェイスに移動することもできます。
1 2 3 4 5 6 7 8 |
<script setup lang= "ts" > interface Props {
foo: string bar?: number } const props = defineProps<Props>() </script> |
タイプベースのアプローチはより簡潔ですが、props のデフォルト値を定義する機能が失われます。現在実験中のリアクティブ構文シュガーを使用してこれを解決できます。
1 2 3 4 5 6 7 |
<script setup lang= "ts" > interface Props {
foo: string bar?: number } // 响应性语法糖 默认值会被编译为等价的运行时选项 const { foo, bar = 100 } = defineProps() |
この動作は現在、構成で明示的に有効にする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// vite.config.js export default {
plugins: [ vue({
reactivityTransform: true }) ] } // vue.config.js module.exports = {
chainWebpack: (config) => {
config.module .rule( 'vue' ) .use( 'vue-loader' ) .tap((options) => {
return {
...options, reactivityTransform: true } }) } } |
使用しない場合
1 2 3 4 5 6 7 8 9 |
import { defineComponent } from 'vue' export default defineComponent({
props: {
message: String }, setup(props) {
props.message // <-- 类型:string } }) |