- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 Object.fromEntries()
编写一个更好的定义,以推断结果对象的实际键和值。我有我认为可行的方法,但显然 infer U
的作用域是我的方法无法找到 U
的。
interface ObjectConstructor {
fromEntries<
K extends PropertyKey,
V,
A extends ReadonlyArray<readonly [K, V]> = ReadonlyArray<readonly [K, V]>
>(array: A): {
[key in A[number][0]]: A[number extends infer U ? U : never][0] extends key ? A[U][1] : never;
};
}
A[U][1]
中的 U
无法访问。
Cannot find name 'U'.
另一个问题是 A[number extends infer U ? U : never][0] extends key
似乎总是评估为 false
。
如何检索与key
关联的数组的索引?我猜测有一些 hacky 类型将数组包装在一个函数中,并检查该函数是否扩展了可以推断索引的东西,但我的最佳尝试没有成功。
type ArrayIdxOf<A extends readonly unknown[], K> =
(((i: keyof A) => A[typeof i]) extends ((i: number & infer U) => A[typeof i] extends K ? typeof i : never) ? (i: U) => U : never) extends
((i: number) => infer U)
? U
: never;
const a1 = ['foo', 'bar'] as const;
type A = ArrayIdxOf<typeof a1, 'foo'>; // type A = unknown
interface ObjectConstructor {
fromEntries<
K extends PropertyKey,
V,
A extends ReadonlyArray<readonly [K, V]> | Array<[K, V]>
>(array: A): {
[key in A[number][0]]: ArrayIdxOf<A, key> extends infer I ? I extends number ? A[I][1] : never : never;
};
}
const a2 = [['foo', 'foo'], ['bar', false], [1, 2]] as const;
const x = Object.fromEntries(a2);
/**
* const x: {
* foo: never;
* bar: never;
* 1: never;
* }
*/
如果可能的话,我还想消除 A
的 readonly
约束。
TS Playground虽然虽然使用 tsc
进行编译,但它不会在 Playground 中编译,所以我不知道它会有多大用处。
最佳答案
我可能会做类似的事情
declare global {
interface ObjectConstructor {
fromEntries<
A extends ReadonlyArray<readonly [PropertyKey, any]>
>(array: A): { [K in A[number][0]]: Extract<A[number], readonly [K, any]>[1] }
}
}
请注意,readonly
不是一个约束,而是一个宽松...string[]
可以分配给 readonly string[]
,但是反之则不然。通过接受readonly
数组,你接受了更多的东西,而不是更少。所以我会保留它们(这很好,因为 as const
往往会产生 readonly
的东西)。
这适用于您的示例:
const x = Object.fromEntries(b);
/* const x: {
foo: "foo";
bar: false;
1: 2;
} */
如果你想给编译器一个提示,它应该尝试将每个元组的第一个元素读取为 literal类型,您可以给它这个修改后的定义:
declare global {
interface ObjectConstructor {
fromEntries<
P extends PropertyKey,
A extends ReadonlyArray<readonly [P, any]>
>(array: A): { [K in A[number][0]]: Extract<A[number], readonly [K, any]>[1] }
}
}
这在您的 as const
版本上的工作方式相同,但如果您直接传递数组文字也将工作:
const c = Object.fromEntries([['foo', 'foo'], ['bar', false], [1, 2]]);
/* const c: {
foo: string;
bar: boolean;
1: number;
} */
您可以稍微调整推论,但基本方法是使用 Extract
实用程序类型从数组中提取适当的元组。
无论如何,希望能给你一些指导。祝你好运!
关于typescript - 推断 TypeScript 中 Object.fromEntries() 结果的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63061180/
我收到 object像这样: this.data = { O: { id: 0, name: value1, organization: org
我在某些较旧的 iPhone(例如 iPhone 7 和 iPhone 10)上遇到此错误 我找不到解决方案。 我正在使用的库 "@chakra-ui/react": "^1.4.1", "
我正在尝试学习Dart编程语言。 我不了解Map.fromEntries()工厂构造函数。寻找用法示例。 链接:Map.fromEntries() 最佳答案 Map.fromEntries 构造函数旨
前段时间,我读到关于新方法的提议 Object.fromEntries()某些浏览器的较新版本支持 ( reference )。在阅读它时,我想到了使用此方法深度克隆一个对象的想法,而不是使用JSON
我有一个简单的 Ember 应用程序,我需要在组件中填充 Object.fromEntries。 作为引用,我使用原生支持 fromEntries 的 Safari 12.1.1,而 Safari 1
简单代码: const o = { arr: ['a', 'b'] } const s = new URLSearchParams(o).toString(); // restore: const r
我正在尝试为 Object.fromEntries() 编写一个更好的定义,以推断结果对象的实际键和值。我有我认为可行的方法,但显然 infer U 的作用域是我的方法无法找到 U 的。 interf
这里是 TypeScript 新手,Object.fromEntries 有问题。我正在尝试削减形式并将其值(value)转换到其他东西上。例如,给定所有数据都是字符串的同质形状,下面的工作: //
我正在尝试为 Object.fromEntries() 编写一个更好的定义,以推断结果对象的实际键和值。我有我认为可行的方法,但显然 infer U 的作用域是我的方法无法找到 U 的。 interf
这里是 TypeScript 新手,Object.fromEntries 有问题。我正在尝试削减形式并将其值(value)转换到其他东西上。例如,给定所有数据都是字符串的同质形状,下面的工作: //
我一直在关注 Tailwind's tutorials什么时候。我进入教程的一部分,他们要求我运行 npx tailwindcss-cli build css/tailwind.css -o buil
标题很容易理解,但请考虑以下示例代码: import * as React from 'react'; import { Text, View, StyleSheet } from 'react-na
我找不到使用此方法所需的最低 NodeJS 版本。 谢谢。 最佳答案 看here在底部,对于 node.js,它是 12.0.0 关于node.js - NodeJS - 从哪个 Node 版本 Ob
我使用 Vercel 创建了一个 next.js 应用程序,然后使用以下命令行安装了 chakra-ui: npm i @chakra-ui/react @emotion/react@^11 @emo
我是一名优秀的程序员,十分优秀!