问题标签 [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.
javascript - 键入接收对象并更新属性的方法的正确方法是什么?
我的问题是关于我的更新方法。正如您在下面看到的,它可以接收一个对象(newState),并使用 Object.assign() 更新类实例属性。我需要告诉 TS 它应该只接受:
- 一个东西
- 作为 State 类的键的属性
- 那些属性的值是属性的正确类型。
我是否正确输入了此方法?有更好的//其他方法吗?
另外,在 main.ts 中,State 类实现 StateInterface 上,TS 编译器有一个错误,即 update (newState) 的参数隐式为 any。它不应该从 types.d.ts 接收类型信息吗?:
typescript - 打字稿:在静态方法中使用子类
在 TypeScript(我使用Playground,版本 4.13)中,当我从一个类继承时,父类this
的方法内部static
似乎是指继承类:
但是,当我想根据子类的类型定义一些行为时,我遇到了问题:
这给了我
元素隐式具有“任何”类型,因为表达式类型为“字符串 | 号码 | 符号'不能用于索引类型'typeof Parent'。在“typeof Parent”类型上找不到带有“string”类型参数的索引签名。
我试图通过类型转换key
作为子类的键来解决这个问题:
但这是被禁止的。我明白了
“this”类型仅在类或接口的非静态成员中可用
另外,我得到(在所有情况下)
“父”类型上不存在属性“id”。
如何解决我的问题 - 从对象(我在现实世界场景中从 API 接收)动态填充子类的属性?
typescript - Typescript 泛型不会像我希望的那样解析具体类型
我有一个保存项目列表的类,但不是将它们保存在一个平面数组中,而是将它们保存在一个对象映射中,其中每个属性代表一组项目。就像我们有一个汽车清单,我们会按制造商对它们进行分组。
该类有两个泛型类型参数:
- 我们将分组的项目类型(即
Car
) - 组键(即
'renault' | 'peugeot' | ...
)
然后类成员都被定义为对象映射:
groups
将项目保留在组数组中countryGetters
也是一个与项目组具有相同属性的对象映射,但它们定义了一个函数,该函数返回传入的汽车的制造商国家
使用示例
上面的代码似乎没有错误,但随着它的使用,类型似乎没有得到应有的解析。当我尝试使用未在映射或联合类型的组键中定义的项目组名称时,我希望编译器/linter 抱怨...
如您所见,Typescript 没有解析组名,所以我的类型定义不够严格(我想),因此我可以无效地操作不存在的组。从编译时的角度来看,上面的代码似乎很好,但应该为我做检查,intellisense 应该帮助我填写组名。
这是tinker的操场链接。
typescript - 打字稿无法捕获不兼容的泛型类型错误
我想创建一个可以处理泛型特征对象的函数。代码如下
在 marker1 处,错误是预期的,而且很好。所以我预计,应该在marker2上抛出错误,但它没有。奇怪的是,实际上打字稿知道我应该在marker2中使用的类型,显示出一些智能感知,如附图所示。但它只是接受 settingsB 而不会发出任何警告。这是为什么?上面的代码可以在打字稿操场上运行
typescript - 如何在函数中具有必需和可选类型参数,并且仍然具有用于记录查找的工作类型推断?
如何使Y
函数中的必需类型参数与另一个类型参数一起工作,K
后者仅用作记录R = {a: 'aaa', b: 'bbb'}
查找中的键并且不应该显式提供?类型参数K
应该从函数的第一个参数的值推断k
出来foo
。然后我想K
用来查找一个类型,R
以便我可以将它用于函数的其他参数。
为了只允许需要第一个类型参数Y
,K
参数需要有一个默认值。但是这个默认值打破了R[K]
when 的推断,而不是根据k
ieR[typeof k]
的值推断"aaa"
if k
was "a"
,它使用默认的K
ieR[keyof R]
解析为记录中所有类型的联合,R
即"aaa" | "bbb"
忽略k
。
是否可以在没有显式传递的情况下从值解析y: R[keyof K]
where的类型推断,但仍然允许所需的类型参数?K
k
K
Y
我只能通过对函数进行柯里化来使其工作,因此每个类型参数都属于一个单独的函数:
typescript - 在方法中使用 keyof 来输入参数
假设您有以下课程:
可以通过其他方法(稍后)更改回调属性。
如何确保作为属性提供的键是回调属性的实际键?如果将回调实例传递给函数,我会这样做:
但这不适用于“this”关键字。我知道在泛型中使用原始 this.callbacks 是不正确的,因为 this.callbacks 不是类型,而是实例。但是,用 typeof 转换它也不会产生结果。
我错过了一些明显的东西吗?我的整个设计模式有缺陷吗?
typescript - 如何在 Typescript 中为对象属性动态分配值?
我有这两种类型:
现在我想声明一个 的变量type D
,但我不想一个一个地分配每个 absolutePropertyName ,像这样:
有没有办法为每个属性动态分配一个值?
typescript - Typesript 参数依赖于另一个具有默认值的参数
我正在尝试在 typescript 中创建一个函数,其中第二个可选参数是第一个参数的键。没有可选参数,我想要的函数看起来像
但是,我想key
是可选的,并采用默认值"id"
. 但是,函数
不进行类型检查,因为打字稿不知道是否T
有id
. 解决此问题的部分方法是编写
然而,这股力量T
总是有一把钥匙的id
。
我的问题是,我可以编写一个函数getValGood
来进行类型检查getValGood({id: 1})
、类型检查getValGood({ID: 1}, "ID")
并且getValGood({ID: 1})
不进行类型检查。如果是这样,我如何getValGood
在打字稿中表示?
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
。