gpt4 book ai didi

javascript - Typescript 索引签名任何 - 仅适用于 `any`?

转载 作者:搜寻专家 更新时间:2023-10-30 20:43:15 25 4
gpt4 key购买 nike

我有一个接口(interface)和一个类:

export interface State {
arr : any[];
}


export const INITIAL_STATE: State = {
arr: []
};

这编译。

现在我将界面改成这样:

export interface State {
arr : any[];
[key: string]: any
}

类应该是这样的:

export const INITIAL_STATE: State = {
arr: [] ,
'a':2
};

- 仍然编译。

但是现在 - 如果我想更严格:[key: string]: any ---> [key: string]: number :

换句话说:

export interface State {
arr : any[];
[key: string]: number
}


export const INITIAL_STATE: State = {
arr: [] ,
'a':2
};

我得到一个错误:

Error:(7, 14) TS2322: Type '{ arr: undefined[]; 'a': number; }' is not assignable to type 'State'. Property 'arr' is incompatible with index signature. Type 'undefined[]' is not assignable to type 'number'.

问题:

这是为什么?
我不明白这个限制背后的逻辑。我能做些什么来解决它?

最佳答案

界面如下:

export interface State {
arr : any[];
[key: string]: number
}

甚至没有创建对象就出现以下错误:

Property 'arr' of type 'any[]' is not assignable to string index type 'number'

这是因为一旦定义了 [key: string]: number,TypeScript 认为所有属性都应该是映射到数字的字符串。所以你不能有一个数组,除非你这样做:

export interface State {
[key: string]: number | any[]
}

请注意以下接口(interface)起作用的原因:

export interface State {
arr : any[];
[key: string]: any
}

[key: string]: any 告诉 TypeScript“将字符串映射到任何东西”,换句话说,“关闭每个字符串属性的类型检查”。这就是为什么您可以毫无错误地使用 arr : any[]; 的原因。

关于javascript - Typescript 索引签名任何 - 仅适用于 `any`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48032926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com