问题标签 [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 投票
3 回答
567 浏览

typescript - 打字稿:强制执行现有的对象键

我想dropdownAttributes仅限于DropDownItem界面上的属性。

如果DropDownItem现在有动态属性,我想我可以这样解决这个keyof问题:

但这在我的情况下现在不起作用。怎么解决?

0 投票
2 回答
5405 浏览

javascript - 打字稿:从对象数组派生联合类型

我想声明一个类型强制的项目数组,并能够从中派生一个联合类型。如果您没有明确地为数组中的项目指定类型,则此模式有效。我不确定如何最好地解释它,所以这里是一个例子:

例 1

例 2

下面是使用as const. 我想要同样的行为,但数组被显式键入。

所需的键值:"foo"|"bar"

键的实际值:string

0 投票
2 回答
827 浏览

reactjs - 使用道具有条件地设置样式组件中的属性以使用 TypeScript 对主题对象进行索引?

概述

我有一个next.js(反应)TypeScript 项目正在使用styled-components ThemeProvider. 我正在尝试对存储基于字体大小的theme对象进行索引,并按点大小()进行索引。我遇到的问题是我无法根据从组件传递的道具动态设置索引。错误消息、代码示例、尝试的解决方案和观察结果如下remstringsinteger

错误信息


代码示例

主题对象类型定义

样式化的.d.ts


样式化组件theme对象

主题.ts


样式化组件

组件.ts


反应功能组件

东西.tsx


尝试的解决方案

我试图index signature根据一些TypeScript docs定义一个,但不清楚如何实现它。这是我尝试的:


观察

我的脑袋疼 ... ;)

0 投票
1 回答
48 浏览

javascript - 为什么“道具”的这种 TS 实现有效,而我的却没有?

我正在浏览一些关于如何使用 typescript 的keyof特性来实现 Ramda/Underscore 中的经典函数的博客,该函数prop返回与某个对象上给定键对应的值。

例子:

我最终得到了这个确实有效的实现(类似于下划线):

但是当我将其更改为咖喱版本时:

当我尝试将其调用为时出现错误prop('someProp')(someObj);当我将鼠标悬停在上面时,prop我收到一条错误消息,Argument of type 'someProp' is not assignable to parameter of type 'never'我真的不知道为什么。

我该怎么办?

更新:解决了!现在这些测试通过了:

哦,伙计,我不知道 Record 和 PropertyKey 存在...

0 投票
1 回答
1423 浏览

typescript - 如何将数据组表示为通用 Typescript 接口

简而言之:

如何使用 Typescript 类型的系统声明一个作为类型参数的泛型接口

  • 组的一种类型G(属于一个组的所有属性)
  • 组中某个项目的类型I(一个项目的所有属性,其中一个组有几个)
  • N中的一种属性类型G,它的值是该组G[N]的项目数组I[]

并让生成的接口类型是一个组 G,其属性 N 被键入到项目 I 的数组中,同时在生成的类型中还包括 G 的所有其他属性。



到目前为止我尝试过的

修订 #2(成功)

在阅读了一些关于计算索引类型(正确的名称?)及其局限性之后,我想出了这种方法:

我使用联合类型来组合通用“组”接口和“其他”属性,从而产生我想要的结构的完全类型检查对象。在这个操场上看看

修订 #1

第一个答案告诉我我有一个语法错误。它提供了一个具有 3 个类型参数的有效接口。但是,生成的类型缺少项目数组以外的任何组属性。

我的下一次尝试,似乎是无效的打字稿(见操场):


我天真的第一次尝试:

但是,正如您在这个 TS Playground中看到的那样,Typescript 编译器对此并不满意,我想不出办法。

这个结构的具体用法

假设以下类型

已定义,我想创建一个泛型类型GroupOfItems<MovieList, Movie, 'movies'>,该类型应映射到类似的结构

但是,我也希望具体类型GroupOfItems<Playlist, Song, 'songs'> (假设PlaylistSong定义)与

提问的动机

我正在尝试实现一个通用数据源类,该类可以对其数据进行分组并切换项目组的可见性。虽然输入数据的结构是不变的,但保存组项目的属性名称在现有接口中可能不同。

0 投票
2 回答
59 浏览

typescript - 打字稿函数,其中对象具有由另一个参数确定的字符串类型属性

我想创建一个 TypeScript 函数,该函数接受一个对象和该对象内的一个属性,其值为 a string。使用<T, K extends keyof T>工作来确保只T允许键作为属性的值,但我似乎无法缩小范围,以便键也必须指向 type 的属性string。这可能吗?

我试过这个:

但它只是说Type 'T[K]' is not assignable to type 'string'。为什么T extends {K: string}约束不能确保它T[K]实际上是 a string,或者更确切地说,提供的K必须满足条件,所以它T[K]是 a string

为了清楚起见,我希望能够像这样调用这个函数:

0 投票
2 回答
616 浏览

typescript - 通过字符串属性名称对属性进行打字稿类型安全更新

我需要通过字符串属性名称更新类的属性值。我首先通过此方法确保属性名称有效:

然后在另一堂课上,我正在这样做:

查找现在运行良好,但要进行更新,我必须把它放在// @ts-ignore那里,我真的很想弄清楚如何正确地做到这一点,而不必在那里忽略。

我打开了严格的检查,所以我得到了错误

TS2322:类型“任何”不可分配给类型“从不”

0 投票
1 回答
645 浏览

typescript - 用于为 keyof 断言值类型的 TypeScript 别名

无法发现是否可以使用类型别名断言属性的值类型。这是我的例子:

我遇到的问题是,发生了 TS2345。我希望能够构建一个只允许T[keyof T]原始值的函数签名。

0 投票
1 回答
249 浏览

typescript - 在 Typescript 中定义静态可索引对象属性

我想用一个对象属性编写一个可重用的 TypeScript 类,该属性具有索引的命名属性,可以在构造时定义,然后通过它们的名称进行修改。这些命名属性可能是接口的键,我的目的是使用此接口静态检查 set 函数是否存在不正确的键或迭代,例如:

但是上述方法不起作用,因为:

1:元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“{}”。在“{}”类型上找不到带有“字符串”类型参数的索引签名。

2:类型'keyof T'不能用于索引类型'{}'

keyof 是否适用于泛型类,我可以在 TypeScript 中实现类似的功能吗?我正在使用 TypeScript 3.9.4

0 投票
1 回答
134 浏览

typescript - 如何使用名为“keyof”类型的属性创建对象文字

我什至找不到合适的词来提出这个问题。这是我想要实现的简化代码。

错误是:Conversion of type '{ [x: number]: T[TId]; }' to type 'T' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first. 'T' could be instantiated with an arbitrary type which could be unrelated to '{ [x: number]: T[TId]; }'.ts(2352)