gpt4 book ai didi

typescript - 如何为映射类型添加索引签名?

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

假设我有接口(interface)

interface X {
a: string;
b: number;
c: boolean;
}

和一个函数

function values(x: X) {
return Object.keys(x).map(s => x[s])
}

当我启用 typescript 的 strict 标志时,我收到错误消息“元素隐含地具有‘任何’类型,因为类型‘X’没有索引签名”。所以为了明确,我可以在 X 的定义中添加一个索引签名

[key: string]: any;

简单易行。


但是,如果 I X 现在是一个映射类型:

type X<T> = {
[P in keyof T]: string;
}

我有这个功能

function values<T>(x: X<T>) {
return Object.keys(x).map(s => x[s])
}

我应该在哪里添加索引签名?有没有什么办法可以使这一点明确而不诉诸于做一些像 Object.keys(x).map(s => (x as any)[s])

这样粗暴的事情

最佳答案

您可以:

interface X {
a: string;
b: number;
c: boolean;
[key: string]: X[keyof X];
}

X[keyof X] 的结果现在将是 (string | number | boolean),它比 any 效果更好,因为您的函数的返回值将是 (string | number | boolean)[]

Example

另一种适用于这两个示例的方法是:

function values(x: X) {
const keys = Object.keys(x) as (keyof X)[];
return keys.map(s => x[s]);
}

不漂亮,但至少比 (x as any) 类型更多。

当然也可以做成通用的:

function values<T>(x: T) {
const keys = Object.keys(x) as (keyof T)[];
return keys.map(s => x[s]);
}

关于typescript - 如何为映射类型添加索引签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47464764/

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