问题标签 [keyof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
178 浏览

typescript - 为什么 Typescript 不能在赋值中使用泛型的 keyof 类型并将其泛化为字符串?

我遇到了一个奇怪的 Typescript 分配错误,我试图更多地了解它为什么不起作用。作为参考,我正在使用 TS 3.9.2

编码:

错误:

只有当我使用泛型时才会出现问题,例如,如果U我不使用具体接口,那么它会按预期工作。

我假设类型系统在U分配期间无法正确推断和使用它们的键,这是为什么呢?我检查了它k内部{ [k]: a[k] }正确返回的类型,keyof U所以我不完全理解为什么类型系统不能使用该信息来检查分配是否合法并概括kstring.

谢谢你。

0 投票
2 回答
44 浏览

typescript - 有没有办法在打字稿中描述一种“keyfor”?

有什么方法可以表示对象的键属性应受相关值的限制?相当于 keyof 但与给定键相关的值?

应该管用

不应该工作

0 投票
1 回答
842 浏览

typescript - 部分重叠的打字稿键

我想输入一个允许默认值的数据库插入函数:(我正在使用 setOptional 的type-fest

我想用 SetOptional 说的是数据对象应该包含 T 中的任何内容,而不是在默认值 (D) 中指定,但它可以覆盖默认值中的任何内容。

可悲的是,这导致了以下错误

打字稿游乐场以获得更详细的示例。

有什么方法可以过滤 Partial 以仅包含 T 的键,因为我假设这是由于 D 可能包含不在 T 中的多余属性的问题?

非常感谢

编辑:作为@Alex Chashin 的建议,另一个TS Playground使用键作为定义默认值的方式。

EDIT2:使用 UPD2 @Alex Chashin 中提供的解决方案更新了游乐场

EDIT3:更新了前面的示例,以便也可以省略默认值:操场

0 投票
1 回答
368 浏览

typescript - 在 TypeScript 中,我如何推断我的参数并施加一个约束,即所有项目都是 keyof T,其中 T 是函数的泛型类型?

我的目标是创建一个名为: 的函数getFields。这个函数有一个泛型<T>和一个参数...fields: Array<keyof T>。我希望这个函数返回一个函数,当给定一个类型的对象时,该函数<T>将返回一个简化的对象,其中仅包含名为 in 的属性...fields

以下是一种辅助类型和我的getFields实现:

我用以下代码测试了这个实现:

然而,当我看typeof b它时Pick<A, "a" | "b" | "c">。我真正想要的是Pick<A, "a" | "c">

我已经尝试了很多方法来使这项工作按我的预期进行,但唯一的成功是添加了第二个通用参数,这需要我将代码更改为:

这对我来说太多余了,无法接受。

在这一点上,我认为我已经达到了我的 TypeScript 能力的极限,因为我想不出任何其他方法来完成我正在寻找的东西。

这甚至可以用 TypeScript 做吗?如果是这样,我需要做什么?

0 投票
1 回答
104 浏览

reactjs - 在 TypeScript 中将 hashmap 类型正确作为函数参数

我需要而不是glyph: string传递显式类型enum(或 keyof 字形)。那可能是枚举,但我不想再次复制整个结构。

谢谢你的想法

0 投票
1 回答
395 浏览

typescript - TypeScript keyof 索引类型太宽

抱歉,我确信这已经在某个地方得到了回答,但我不确定要谷歌什么。如果标题中的术语有误,请编辑我的问题。

我有这样的事情:

TypeScript 应该能够action通过检查行的形状以及key赋予列的值来推断函数的类型:

IE:

游乐场链接

问题是,TypeScript 似乎将 value ( value: T[K]) 的类型导出为“T 的所有键可访问的所有类型”,而不是仅使用列对象中提供的键。

为什么 TypeScript 会这样做,我该如何解决?

做出一些好的答案是定义一些特定的术语和概念。

我想我想将我的更改K extends keyof T为“K 是 T 的一个键,但只有一个键,而且它永远不会改变”。

0 投票
0 回答
29 浏览

typescript - TypeScript:使用 keyof T 获取通用对象属性值的类型

我在这里和这里查看了类似的问题到目前为止 没有帮助解决我的问题。如果存在我无法提取的重叠部分,我们深表歉意。

我很难解释我的问题,所以这是我最好的尝试。

我需要使用泛型在特定键处提取对象值的类型...

我将尝试设置一个展示我的问题的最小示例。

我有一个通用类型

render在该泛型类型上有一个函数,它使用两个参数调用:提供的属性处的对象的值prop,以及完整的对象。现在,我将value 键入为 any,但如果可以推断出来,我会喜欢它,因为我们将 ueprop声明为keyof T. 所以我需要val成为Tat 属性的值,prop它恰好是 a keyof T

例子:

希望这是一个很好的例子。基本上,如果函数的第一个参数是类型感知的,我会喜欢它render,因为我们将对象的属性作为prop.

这可能吗?

0 投票
1 回答
46 浏览

typescript - 类型的第一个通用元素上的打字稿类型保护

我有一个Actions类型需要映射到actionMap变量中的一组回调。

但是,我不确定如何强制类型的第一个通用元素的Action类型。显然key in keyof Actions不是在这里做的伎俩。我需要用什么代替?

如果我问错了问题,什么是更好的问题?我不确定我是否相应地使用了行话。

0 投票
3 回答
67 浏览

typescript - TypeScript - 限制元组泛型的类型保存映射类型

在 TypeScript 中,这不是编译:

特别是,Generic<T[P]>失败与Type 'T[P]' does not satisfy the constraint 'string'.. 但是,既然T extends string[],可以肯定的是,T[P] extends string对于任何P in keyof T.

我在这里做错了什么?


我知道我可以用条件类型解决问题:

但我不明白,为什么这应该是必要的。

0 投票
2 回答
195 浏览

typescript - 如何在对象形状而不是显式类型上使用 keyof

我想根据 TypeScript 中另一个对象的键创建一个类型。

我已经设法通过类型推断来做到这一点。但是,如果我使用显式类型Record<string, something>,则keyof给我string而不是我使用的实际键的联合。

TypeScript 游乐场 GIF

这是示例代码:

相关的 TypeScript Playground

有什么方法可以在表单中使用显式类型Record<string, something>并仍然获得联合类型keyof吗?我想可以使用行为类似typeof但使用对象的形状而不是其声明的类型的关键字,但是 TypeScript 是否实现了这样的事情?