【发布时间】:2021-04-15 02:17:11
【问题描述】:
更新:对于所需的行为,TypeScript 需要存在的泛型类型 - 就好像 TS 4.1 它没有它们一样。感谢有用的答案。我认为要解决输入 react-query useQueries 的问题,仍然有一种方法可以在提供 selector 时使用 unknown。我会努力让它发挥作用,看看结果如何。
考虑以下几点:
interface Data<TData = unknown, TSelected = unknown> {
data: TData;
selector?: (data: TData) => TSelected
}
function makeArrayAsConstItemsForDataTypesOnly<
TItem extends readonly Data[]
>(arr: [...TItem]): { [K in keyof TItem]: { item: Extract<TItem[K], Data>["data"] } } {
return arr.map(item => {
return item.selector
? { item: item.selector(item.data) }
: { item: item.data }
}) as any;
}
const returnedData = makeArrayAsConstItemsForDataTypesOnly([
{ data: { nested: 'thing' }, selector: d => d.nested },
{ data: 1 },
{ data: 'two' }])
returnedData 取类型:
const returnedData: [{
item: {
nested: string;
};
}, {
item: number;
}, {
item: string;
}]
selector 可能会或可能不会随每个元素一起提供。如果提供,它会映射提供的 data 类型并转换返回的数据。
鉴于上述示例,理想情况下返回的类型为:
const returnedData: [{
item: string;
}, {
item: number;
}, {
item: string;
}]
唉,在 selector: d => d.nested 中,d 也不是采用 unknown 类型,而不是 TData 类型。所以我们没有像希望的那样进行类型推断。
返回类型的伪代码如下所示:
- 对于数组的每个条目:
- 获取
data属性 - 如果数组条目包含
selector,则返回{ item: entry.selector(entry.data) } - 否则返回
{ item: entry.data }
- 获取
是否可以通过 TypeScript 中的类型系统来表达这一点? See playground here.
所以这里有两个问题:
-
selector流经TData作为输入 - 整个函数的返回类型
【问题讨论】:
-
只有
d.nested有问题吗? -
否 - 有 2 个问题: 1. 在
selector: d => d.nested中,d 的类型为unknown,而不是TData。 2.问题中陈述的问题。为了清楚起见,我可能应该对其进行编辑 - 这就是你的意思吗? -
已编辑并在上面提到
标签: typescript types tuples variadic conditional-types