gpt4 book ai didi

reactjs - typescript 如何混合动态([key : type]: type) and static typing for an interface

转载 作者:行者123 更新时间:2023-12-04 01:37:12 34 4
gpt4 key购买 nike

主要问题
不太确定这是否可能,但由于我讨厌 Typescript 并且它使我的编码变得困难,我想我会问只是为了确定。

interface ISomeInterface {
handler: () => {}
[key: string]: string
}
问题显然是, handler() => {}而不是字符串,所以 typescript 会引发错误。有可能以某种方式完成这项工作吗?
附录:
在这个话题上,这个接口(interface)应该被 React.Context 使用。并且由于 React.createContext(/* requires default here */) 需要默认值,我需要给它一个匹配该接口(interface)的对象。当我尝试像这样传递一个对象时:
React.createContext({handler: () => {throw new Error('using default context')}})
Typescript 通过说 {handler: () => never} cannot be assigned to {handler: () => {}} 引起骚动有什么方法可以使这个界面合理吗?我试图让接口(interface)实现 () => any ,还是不行,要显式 never .
编辑#1:
所以我做了一些改变,即:
interface IFormContext {
$handleChange: (key?, val?) => void
$registerField: (key?) => void
[key: string]: { value: string } | ((key?, val?) => void)
}
但是现在当我试图访问这样的字段时: const {[key]: { value }} = props这基本上是使用动态键进行解构,我收到以下错误:

Property 'value' does not exist on type '{ value: string; } | ((key?: any, val?: any) => void)'.ts(2339)

最佳答案

不幸的是,您的命名属性必须与 index signature 匹配。 .
在这种情况下,由于至少有一个属性是函数,您可以使用:
[key: string]: string | Function;
或者
[key: string]: any;
两者都应该工作。

对于您的附录,() => {}表示没有参数的函数返回一个空对象,而函数 () => {throw new Error('using default context')}没有返回任何内容,因此出现错误。
类型和实际函数实现中使用的大括号有点混淆。

类型为 () => {} 的函数实际上类似于 () => {return {}}() => ({}) .

对于不返回任何内容的函数,您可以使用 nevervoid ,但如果您的处理程序可能返回某些内容,您可以使用 handler: () => void | boolean 之类的内容, 用它可能返回的类型替换 bool 值。

关于reactjs - typescript 如何混合动态([key : type]: type) and static typing for an interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59091272/

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