问题标签 [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 回答
34 浏览

javascript - 键入接收对象并更新属性的方法的正确方法是什么?

我的问题是关于我的更新方法。正如您在下面看到的,它可以接收一个对象(newState),并使用 Object.assign() 更新类实例属性。我需要告诉 TS 它应该只接受:

  • 一个东西
  • 作为 State 类的键的属性
  • 那些属性的值是属性的正确类型。

我是否正确输入了此方法?有更好的//其他方法吗?

另外,在 main.ts 中,State 类实现 StateInterface 上,TS 编译器有一个错误,即 update (newState) 的参数隐式为 any。它不应该从 types.d.ts 接收类型信息吗?:

0 投票
1 回答
623 浏览

typescript - 打字稿:在静态方法中使用子类

在 TypeScript(我使用Playground,版本 4.13)中,当我从一个类继承时,父类this的方法内部static似乎是指继承类:

但是,当我想根据子类的类型定义一些行为时,我遇到了问题:

这给了我

元素隐式具有“任何”类型,因为表达式类型为“字符串 | 号码 | 符号'不能用于索引类型'typeof Parent'。在“typeof Parent”类型上找不到带有“string”类型参数的索引签名。

我试图通过类型转换key作为子类的键来解决这个问题:

但这是被禁止的。我明白了

“this”类型仅在类或接口的非静态成员中可用

另外,我得到(在所有情况下)

“父”类型上不存在属性“id”。

如何解决我的问题 - 从对象(我在现实世界场景中从 API 接收)动态填充子类的属性?

0 投票
1 回答
137 浏览

typescript - Typescript 泛型不会像我希望的那样解析具体类型

我有一个保存项目列表的类,但不是将它们保存在一个平面数组中,而是将它们保存在一个对象映射中,其中每个属性代表一组项目。就像我们有一个汽车清单,我们会按制造商对它们进行分组。

该类有两个泛型类型参数:

  • 我们将分组的项目类型(即Car
  • 组键(即'renault' | 'peugeot' | ...

然后类成员都被定义为对象映射:

  • groups将项目保留在组数组中
  • countryGetters也是一个与项目组具有相同属性的对象映射,但它们定义了一个函数,该函数返回传入的汽车的制造商国家

使用示例

上面的代码似乎没有错误,但随着它的使用,类型似乎没有得到应有的解析。当我尝试使用未在映射或联合类型的组键中定义的项目组名称时,我希望编译器/linter 抱怨...

如您所见,Typescript 没有解析组名,所以我的类型定义不够严格(我想),因此我可以无效地操作不存在的组。从编译时的角度来看,上面的代码似乎很好,但应该为我做检查,intellisense 应该帮助我填写组名。

这是tinker的操场链接。

0 投票
0 回答
24 浏览

typescript - 打字稿无法捕获不兼容的泛型类型错误

我想创建一个可以处理泛型特征对象的函数。代码如下

在 marker1 处,错误是预期的,而且很好。所以我预计,应该在marker2上抛出错误,但它没有。奇怪的是,实际上打字稿知道我应该在marker2中使用的类型,显示出一些智能感知,如附图所示。但它只是接受 settingsB 而不会发出任何警告。这是为什么?上面的代码可以在打字稿操场上运行 在此处输入图像描述

0 投票
1 回答
72 浏览

typescript - 如何在函数中具有必需和可选类型参数,并且仍然具有用于记录查找的工作类型推断?

如何使Y函数中的必需类型参数与另一个类型参数一起工作,K后者仅用作记录R = {a: 'aaa', b: 'bbb'}查找中的键并且不应该显式提供?类型参数K应该从函数的第一个参数的值推断k出来foo。然后我想K用来查找一个类型,R以便我可以将它用于函数的其他参数。

为了只允许需要第一个类型参数YK参数需要有一个默认值。但是这个默认值打破了R[K]when 的推断,而不是根据kieR[typeof k]的值推断"aaa"if kwas "a",它使用默认的KieR[keyof R]解析为记录中所有类型的联合,R"aaa" | "bbb"忽略k

是否可以在没有显式传递的情况下从值解析y: R[keyof K]where的类型推断,但仍然允许所需的类型参数?KkKY

我只能通过对函数进行柯里化来使其工作,因此每个类型参数都属于一个单独的函数:

0 投票
1 回答
69 浏览

typescript - 在方法中使用 keyof 来输入参数

假设您有以下课程:

可以通过其他方法(稍后)更改回调属性。

如何确保作为属性提供的键是回调属性的实际键?如果将回调实例传递给函数,我会这样做:

但这不适用于“this”关键字。我知道在泛型中使用原始 this.callbacks 是不正确的,因为 this.callbacks 不是类型,而是实例。但是,用 typeof 转换它也不会产生结果。

我错过了一些明显的东西吗?我的整个设计模式有缺陷吗?

0 投票
1 回答
193 浏览

typescript - 如何在 Typescript 中为对象属性动态分配值?

我有这两种类型:

现在我想声明一个 的变量type D,但我不想一个一个地分配每个 absolutePropertyName ,像这样:

有没有办法为每个属性动态分配一个值?

0 投票
2 回答
44 浏览

typescript - Typesript 参数依赖于另一个具有默认值的参数

我正在尝试在 typescript 中创建一个函数,其中第二个可选参数是第一个参数的键。没有可选参数,我想要的函数看起来像

但是,我想key是可选的,并采用默认值"id". 但是,函数

不进行类型检查,因为打字稿不知道是否Tid. 解决此问题的部分方法是编写

然而,这股力量T总是有一把钥匙的id

我的问题是,我可以编写一个函数getValGood来进行类型检查getValGood({id: 1})、类型检查getValGood({ID: 1}, "ID")并且getValGood({ID: 1})不进行类型检查。如果是这样,我如何getValGood在打字稿中表示?

0 投票
1 回答
93 浏览

typescript - 打字稿:类型问题的关键

例如,如果我有这个User模型:

并尝试运行此代码:

我收到此错误:

这是重现该问题的示例。

任何帮助将不胜感激,谢谢。

更新:找到一篇与此问题相关的精彩文章。

0 投票
0 回答
24 浏览

typescript - 将函数参数约束为从不消除映射类型不满足约束的无效代码路径

我整理了一个简单的 Store 实现,它将一个不可变的 javascript 'root' 项包装为状态。

操作允许使用partition键从父存储中派生子存储。新 Store 的根状态是在该键处找到的原始根状态的子状态。子存储在其他方面的功能与根存储相同。

该实现似乎工作正常,但不幸的是,当(出于其他原因)我需要将可能的根项目限制为extends object. 当然只有一些子项会满足这个约束,这意味着打字稿会发现递归分区可能出现的错误。

我认为我需要将分区键参数限制为解析为extends object. 我不确定该怎么做。

在这次干预之前,一切在实施和打字方面都运行良好。

一个看起来积极和编译的定义(在添加对象约束之前)是这个......

打字稿游乐场

编译错误可以在相同代码的以下版本中看到,其中 BasicStore 和 BasicPartition 将它们的状态限制为extends object...

最后一行报错Argument of type 'this' is not assignable to parameter of type 'Store<object>'typescript playground

如何将有效的 Key 参数限制为分区函数,以便 State[Key] 始终是一个对象,从而消除无效的代码路径。在伪代码中,我认为 Partitioner 通用参数可能类似于Key extends keyof State where State[Key] extends object. 在这个联合解决的never地方,根本没有有效的论据可供调用partition