让打字稿看到装饰者的道具

Posted

技术标签:

【中文标题】让打字稿看到装饰者的道具【英文标题】:Make typescript see props from decorators 【发布时间】:2018-04-18 17:33:48 【问题描述】:

我有一个像这样使用 mobx 和装饰器的简单组件

import * as React from "react";
import  observer, inject  from "mobx-react/native";
import  Router as ReactRouter, Switch, Route  from "react-router-native";
import Dashboard from "./_dashboard";
import  RouterInterface  from "../store/_router";

// -- types ----------------------------------------------------------------- //
export interface Props 
  router: RouterInterface;


@inject("router")
@observer
class Router extends React.Component<Props, > 
  // -- render -------------------------------------------------------------- //
  render() 
    const  router  = this.props;
    return (
      <ReactRouter history=router.history>
        <Switch location=router.location>
          <Route path="/" component=Dashboard />
        </Switch>
      </ReactRouter>
    );
  


export default Router;

基本上@inject("router") 添加了满足上面 Props 接口的this.props.router,但是 typescript 没有考虑到这一点,每当我在某处使用这个组件时,如果我没有在 props 中传递router,就会出错,因此我需要更改为router?: RouterInterface;,这很好,但并不理想。

有没有办法解决这个问题,打字稿说明装饰器注入道具?

【问题讨论】:

IMO,没有更好的方法:您使用 TypeScript 的适当设计,为注入的props 定义接口。由于装饰器 @inject 在类定义之后应用(关于 TypeScript 编译),因此类必须提前了解装饰器的效果,至少在类型方面。 github.com/mobxjs/mobx-react/issues/256 是关于这类问题的讨论。总结一下:不,目前没有更好的方法。你需要添加吗?到酒店。 【参考方案1】:

有办法解决它。 您可以在单独的接口中声明注入的道具,然后编写一个 getter 函数。我在这里写过:https://gist.github.com/JulianG/18af9b9ff582764a87639d61d4587da1#a-slightly-better-solution

interface InjectedProps 
  bananaStore: BananaStore; // ? no question mark here


interface BananaProps 
  label: string;


class BananaComponent extends Component<BananaProps> 

  get injected(): InjectedProps 
    return this.props as BananaProps & InjectedProps;
  

  render() 
    const bananas = this.injected.bananaStore.bananas; // ? no exclamation mark here
    return <p>this.props.label:bananas</p>
  


【讨论】:

以上是关于让打字稿看到装饰者的道具的主要内容,如果未能解决你的问题,请参考以下文章

Vue Prop 未定义,和/或不能在 v-for 上使用。使用打字稿和装饰器

打字稿自定义装饰器:this的上下文

打字稿装饰混乱

打字稿方法返回未定义的方法装饰器

是否可以模拟打字稿装饰器?

打字稿装饰器不能使用箭头函数