条件类型与映射类型组合时的奇怪语法

骇人的

这是例子

这是操场

这是示例代码:

type FunctionPropertyNames<T> = {
  [K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];

interface Part {
  id: number;
  name: string;
  subparts: Part[];
  updatePart(newName: string): void;
}

type T1 = FunctionPropertyNames<Part>;

const myVar:T1 = 'updatePart'

我真搞不清楚[keyof T]的部分type FunctionPropertyNames<T> = {...}[keyof T]这是我第一次看到这样的语法,但是我在文档中找不到任何有关此语法的信息。您能给我另一个使用它的例子吗?或者也许将我指向可以阅读的方向。或者也许对它如何工作有一个见解。

谢谢你,先生!

阿龙

keyof T是一个表达式,当T作为对象时,其结果为的所有属性名称T例如:

type Thing = { fieldOne: string; fieldTwo: number };

type ThingFields = keyof Thing; // equivalent to: type ThingFields = "fieldOne" | "fieldTwo"

FunctionPropertyNames<T>实用程序令人困惑,但我们可以FunctionPropertyNames<Part>逐步查看它的评估结果"updatePart"


type T1 = FunctionPropertyNames<Part>;

扩大 FunctionPropertyNames<Part>

type T1 = {
  [K in keyof Part]: Part[K] extends Function ? K : never;
}[keyof Part];

扩展keyof表达式

type T1 = {
  [K in "id" | "name" | "subparts" | "updatePart"]: Part[K] extends Function ? K : never;
}["id" | "name" | "subparts" | "updatePart"];

评估条件表达式;索引类型 Part["updatePart"]是唯一满足条件extends Function并因此求值索引类型K,其关键updatePart "updatePart"其他人的评价为never

type T1 = {
  id: never;
  name: never;
  subparts: never;
  updatePart: "updatePart";
}["id" | "name" | "subparts" | "updatePart"];

现在评估属性索引。

例如,{ fieldOne: "abc" }["fieldOne"]将评估为"abc"{ fieldTwo: never }["fieldTwo"]评估为never

在我们的情况下,仅索引with的"updatePart"计算结果不同于never:字符串文字类型"updatePart"其他所有内容的计算结果均为never

type T1 = never | never | never | "updatePart";

简化为

type T1 = "updatePart";

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将类型与出现类型的变量相关联的奇怪语法

来自分类Dev

在映射集合时迅速获取异常“所需类型= NSOrderedSet;给定类型= __NSArrayM”

来自分类Dev

将std :: forward,std :: move和volatile组合时出现意外的返回类型

来自分类Dev

接口无法在条件类型中扩展映射类型

来自分类Dev

Typescript条件映射类型丢失返回类型信息

来自分类Dev

组合IO操作时出现奇怪的类型签名

来自分类Dev

奇怪的C ++语法:函数调用前的类型定义

来自分类Dev

具有多个条件的打字稿条件映射类型

来自分类Dev

TypeScript:测试条件类型相等性-了解语法

来自分类Dev

TypeScript:测试条件类型相等性-了解语法

来自分类Dev

缩小映射类型的值类型

来自分类Dev

基于模板参数的条件编译时类型映射

来自分类Dev

使用联合类型化的条件映射使函数无法调用

来自分类Dev

奇怪的python类型“文本”?

来自分类Dev

奇怪的变量类型声明

来自分类Dev

奇怪的flatMap返回类型

来自分类Dev

奇怪的python类型“文本”?

来自分类Dev

奇怪的工会类型

来自分类Dev

在scala中组合类型

来自分类Dev

组合自由类型

来自分类Dev

SQL:按类型组合

来自分类Dev

SQL:按类型组合

来自分类Dev

Pyspark -- 根据不同列的条件将 <list> 类型的列映射到 list<list>> 类型的列

来自分类Dev

OCaml的类型A。at`语法

来自分类Dev

Java通用类型语法

来自分类Dev

Haskell新类型语法

来自分类Dev

Scala类型语法

来自分类Dev

Java通用类型语法

来自分类Dev

Swift 中的(类型)语法