在找到this method个使用枚举来定义对象之后,我想在Vue中使用这样的对象.

export enum Options {
  randSize = 'randomSized',
  timer = 'showTimer',
  randAngle = 'randomAngle',
  colours = 'multiColour',
  cardSize = 'cardSize',
  numCards = 'numCards'
}

(主零部件):

import { Options} from './util'
let options : {[key in Options]: number | boolean} = {
  [Options.randSize]: true,
  [Options.timer] : false,
  [Options.randAngle] : true,
  [Options.colours] : true,
  [Options.cardSize] : 8,
  [Options.numCards] : 20

}

我还有一个改变期权价值的方法(感谢this post):

function changeOption( option: string, value: number | boolean) {
  options = {...options,[option]:value}
}

但是,当我想要将这些选项用作组件属性时,无法识别枚举:

(父模板):

      <game-options 
        :options = "options"
        @done-setup = "gameStarted=true"
        @change-options="changeOption"
      >
      </game-options>

(子组件):

import { ref, onMounted } from 'vue'
import { Options} from '../util'

const props = defineProps<{
  options: {[key in Options]: number | boolean}
}>()

onMounted(() =>{
  console.log(props.options);
  let foo = props.options.randSize;
})

给出错误Property 'randSize' does not exist on type '{ randomSized: number | boolean; showTimer: number | boolean; randomAngle: number | boolean; multiColour: number | boolean; cardSize: number | boolean; numCards: number | boolean; }'.ts(2339)

如何纠正这一点?

推荐答案

post you linked米中,它说

in Enum编译为枚举valueskeyof typeof编译为枚举keys.

查看您的枚举中的randSize

export enum Options {
  randSize = 'randomSized',
  ...
}

关键点为randSize,值为randomSized.因此,对于{[key in Options]: number | boolean},props 将被称为randomSized,而不是randSize.


当使用更复杂的类型时,请记住有some hard syntax limitation个,尤其是defineProps不能进行实际的类型分析,它只解析语法.对我来说,并不总是清楚一个在哪里结束,另一个在哪里开始.在这种情况下,defineProps无法解析类型,Vue将只知道有一个optionsprops ,但它不知道它的类型.但由于IDE可以完成实际的类型完成,它将推断整个类型,并给出类型错误和自动完成(参见playground).但Vue不会给你输入错误.如果这是可以接受的,那么一切都很好.

但请注意,这一点:

const props = defineProps<{
  [key in Options]: number | boolean
}>()

not将根本不起作用,因为Vue无法解析该类型的实际形状.

Typescript相关问答推荐

如何使用Generics保留构造函数的类型信息?

返回对象的TypScript构造函数隐式地替换This的值来替换super(.)的任何调用者?

为什么tsx不判断名称中有"—"的属性?'

在TypeScrip中分配回调时,参数的分配方向与回调本身相反.为什么会这样呢?

如何使用一个字段输入对象,其中每个键只能是数组中对象的id属性,而数组是另一个字段?

对于合并对象中的可选属性(例如选项),类型推断可能是错误的

Material UI / MUI系统:我如何告诉TypeScript主题是由提供程序传递的?

如何将泛型对象作为返回类型添加到类型脚本中

尽管对象的类型已声明,但未解析的变量<;变量

刷新时保持当前名称的Angular

如何将对象数组中的键映射到另一种对象类型的键?

在Reaction中折叠手风琴

声明遵循映射类型的接口

如果判断空值,则基本类型Gaurd不起作用

类型实例化过深,可能是无限的&TypeScrip中的TupleUnion错误

从以下内容之一提取属性类型

为什么类型脚本使用接口来声明函数?他的目的是什么.

使用强制转换编写打字函数的惯用方法

完全在类型系统中构建的东西意味着什么?

如何在TypeScript中将元组与泛型一起使用?