"An index signature parameter type cannot be a union type." – 我应该使用什么替代?

5 浏览
0 Comments

"An index signature parameter type cannot be a union type." – 我应该使用什么替代?

当我尝试编译这段Typescript代码时,

interface Foo { 
    [foo: "hello" | "world"]: string;
}

我收到了以下错误信息:

索引签名参数类型不能是联合类型。考虑使用映射对象类型来替代。

什么是映射对象类型,我应该如何使用它?

0
0 Comments

问题出现的原因是索引签名参数的类型不能是联合类型(union type),解决方法是使用可选属性(optional property)和never类型。具体解决方法如下:

可以使用可选属性的方式解决该问题,即在索引签名参数后面加上问号(?),表示该属性是可选的。例如:type Foo = { hello: string; world?: never; } | { world: string; hello?: never }

另一种解决方法是使用never类型来限制属性的取值。例如,可以定义一个泛型类型OnlyOneProperty,接受一个联合类型作为属性名,和一个具体类型作为属性值。然后通过联合类型的两个成员分别指定属性名为hello或world,属性值为对应的具体类型。具体代码如下:type Foo = OnlyOneProperty<"hello" | "world", string>

可以通过以下链接查看具体的示例代码:playground

希望以上解决方法能够帮助到你,也希望对你的搜索提供了一些有用的信息。感谢提供链接的帮助。

0
0 Comments

问题的原因是在使用索引签名时,参数类型不能是一个联合类型。解决方法是使用映射类型来替代。

在给定的代码示例中,最初的代码被认为是无效的,因为在Directives类型的索引签名中使用了DirectiveType作为参数类型,而DirectiveType是一个联合类型。为了解决这个问题,可以使用映射类型来代替索引签名。在修改后的代码中,使用了映射类型来将DirectiveType的每个成员作为键,然后将其映射到RootDirectives类型。这样就解决了索引签名参数类型不能是联合类型的问题。

需要注意的是,修改后的代码接受任何字符串作为键,而不仅仅是DirectiveType的成员。这可能会导致键名的限制被移除。如果需要限制键名的范围,可以根据具体需求进行适当的调整。

,问题的原因是索引签名参数类型不能是联合类型。解决方法是使用映射类型来替代索引签名,将联合类型的成员作为键映射到指定的类型。需要注意的是,映射类型可能会移除键名的限制,需要根据实际需求进行调整。

0