在打字稿中的基于 Vue 类的组件中键入 prop

Posted

技术标签:

【中文标题】在打字稿中的基于 Vue 类的组件中键入 prop【英文标题】:typing prop in Vue class-based component in typescript 【发布时间】:2020-03-23 04:42:03 【问题描述】:

在打字稿上下文中处理基于类的组件,并想知道我一直遇到的打字稿错误。

以下是我的组件代码:

<template>
  <b-message :type="statusToBuefyClass">
    <p>PLACEHOLDER</p>
  </b-message>
</template>
<script lang="ts">
import  Component, Vue  from 'vue-property-decorator'
@Component(
  components: ,
  props:        <----------------- typed prop
    status: 
      type: String,
      required: false
    
  
)
export default class Foo extends Vue 

  // explicitly type status
  status!: string         <----------------- explicit, redundant typing

  get statusToBuefyClass(): string 
    const statusHash: 
      init: string
      active: string
      inactive: string
      archived: string
     = 
      init: 'is-warning',
      active: 'is-success',
      inactive: '',
      archived: 'is-danger'
    

    // return statusHash
    return Object(statusHash)[this.status]  <------ error is triggered by this
  

  bar = this.status <------------- this would also error, if not explicitly typed above

  mounted() 

</script>

以上工作没有编译错误。但是,如果我删除 status -- status!: string 的显式输入 -- 我会收到以下错误:

Property 'status' does not exist on type 'Foo'.

我发现了许多类似的文章和问题,但似乎没有一个完全符合我的情况。在我的tsconfig.json 中,我有以下一组,建议的一些帖子可能会有所帮助:

"strict": true,
"noImplicitThis": true,

有什么想法或见解吗?除了传递道具然后在export default class Foo extends Vue ... 中再次输入它们之外,还有其他方法吗?

【问题讨论】:

【参考方案1】:

我不完全确定我是怎么错过的,或者这感觉如何可持续,但我找到了解决方案。

诀窍是使用 @Prop 装饰器。以下编译没有错误:

<script lang="ts">
import  Component, Prop, Vue  from 'vue-property-decorator'
@Component(
  components: 

  // <--------------- props removed from here...

)
export default class Foo extends Vue 

  @Prop(String) status!: string // <--------- use @Prop decorator to type and capture prop from parent

  get statusToBuefyClass(): string 
    const statusHash: 
      init: string
      active: string
      inactive: string
      archived: string
     = 
      init: 'is-warning',
      active: 'is-success',
      inactive: '',
      archived: 'is-danger'
    

    // return statusHash
    return Object(statusHash)[this.status] // <------- no more compilation errors here
  

  mounted() 

</script>

【讨论】:

以上是关于在打字稿中的基于 Vue 类的组件中键入 prop的主要内容,如果未能解决你的问题,请参考以下文章

打字稿中的样式组件“as”道具和自定义道具

无法让嵌套类型保护与打字稿中的联合类型一起使用

在打字稿中键入注释[重复]

如何在打字稿中使用中间件键入 redux thunk

如何使用 react-router Link 访问 React 打字稿中的 props.location?

打字稿中 obj.prop 和 obj['prop'] 的区别?