为啥 TS 没有从 Interface 获得 React 状态断言?

Posted

技术标签:

【中文标题】为啥 TS 没有从 Interface 获得 React 状态断言?【英文标题】:Why does TS do not get React state assertion from Interface?为什么 TS 没有从 Interface 获得 React 状态断言? 【发布时间】:2019-05-28 13:54:18 【问题描述】:

所以,我有这个组件:

type TypeofArray<
    ArrayTypeInstance
> = ArrayTypeInstance extends (infer ElementType)[] ? ElementType : never;

type Property = 
    dataId: number;
    address: string;
    price?: number;
    transactionType: string;
    bedrooms?: number;
    coverImageUrl?: string;
    modifiedWhen: string;
    currentStage?: string;
;

type PropertiesState = 
    searchType: TypeofArray<typeof SEARCH_TYPES>;
    properties: Property[];
    [key: number]: boolean;
;

export class Properties extends Component<, PropertiesState> 
    readonly state = 
        searchType: 'buy',
        properties: []
    ;
...

在这里我正在尝试访问这个状态[key: number]: boolean;

 <PropertyCard
                    isFavorite=this.state[property.dataId]
                />

但我收到此错误:

错误:(98, 33) TS7017: 元素隐式具有“任何”类型,因为 type ' searchType: string;属性:从不[]; ' 没有索引签名。

如果我像这样显式注释状态:

readonly state: PropertiesState = 
    searchType: 'buy',
    properties: []
;

错误消失。

为什么?修复此错误的更好方法是什么?

谢谢!

【问题讨论】:

【参考方案1】:

声明state = searchType: 'buy', properties: [] state 的类型缩小为 searchType: 'buy', properties: never[] never[] 本质上是一个空数组)。根据您的编译器设置,properties 可能会缩小为 any[]

这是因为 TypeScript 从属性声明中推断类型。这些推断的类型会覆盖来自扩展类(例如 React.Component)的任何隐藏类型。

要解决,有几个选项:

    通过使用 PropertiesState 注释 state 重新扩展类型 通过投射 state = /* ... */ as PropertiesState 重新加宽。 在构造函数中赋值this.state以避免变窄:
export class Properties extends Component<, PropertiesState> 
    constructor(props: ) 
        super(props);
        state = 
            searchType: 'buy',
            properties: []
        ;
    
    // ...
;

【讨论】:

非常感谢,很有帮助!

以上是关于为啥 TS 没有从 Interface 获得 React 状态断言?的主要内容,如果未能解决你的问题,请参考以下文章

Ts中的接口interface

vue3+ts 中出现 ‘interface‘ declarations can only be used in TypeScript files.解决方法

为啥我收到 Interface ... 没有构造函数(我有 Kotlin 和 java 类)?

ts中interface和type的区别

ts接口 interface

TS里interface和type