在 TypeScript 中,“extends keyof”和“in keyof”是什么意思?

戈洛·罗登

在 TypeScript 中,某些类型是使用extends keyof定义的in keyof我试图理解它们的意思,但到目前为止我没有成功。

我得到的是,keyof单独返回一个联合类型,该类型将所有名称作为可能的值存在于您在keyof.

type T = keyof string;

T因此等价于startsWith | endsWith | trim | substring | ...

这样对吗?

现在,如果我去想想什么extends keyofin keyof意味着,我的直觉以下称:

  • extends keyof是派生自 的任何类型T,即它具有所有这些可能的值,但可能更多。
  • in keyof是从 中获取值的任何类型T,但不一定是全部(有可能,但可能更少)。

所以,从这个 POVextends keyof将描述一个>=关系,in keyof将描述一个<=关系。这样对吗?如果不是,那什么是正确的?

Tobias Tengler

对于任何类型Tkeyof T是 的已知公共属性名称的联合T

例子:

interface Person {
  age: number;
  name: string;
}

type PersonKeys = keyof Person; // "age" | "name"

因此,您的keyof string收益率假设startsWith | endsWith | trim | ...是正确的。您可以在查找类型发行说明中了解更多信息

extends keyof

extends,在这种情况下,用于约束泛型参数的类型例子:

<T, K extends keyof T>

K因此只能是 的公共属性名称T它与扩展类型或继承无关,与扩展接口相反

的用法extends keyof可能如下:

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

const person: Person = {
  age: 22,
  name: "Tobias",
};

// name is a property of person
// --> no error
const name = getProperty(person, "name");

// gender is not a property of person
// --> error
const gender = getProperty(person, "gender");

除了有关索引类型文档之外,我还发现了这篇有用的文章

in keyof

in当我们定义一个索引签名时使用,我们想要输入字符串、数字或符号文字的联合。结合keyof我们可以使用它来创建所谓的映射类型,它重新映射原始类型的所有属性。

的用法in keyof可能如下:

type Optional<T> = { 
  [K in keyof T]?: T[K] 
};

const person: Optional<Person> = {
  name: "Tobias"
  // notice how I do not have to specify an age, 
  // since age's type is now mapped from 'number' to 'number?' 
  // and therefore becomes optional
};

除了有关映射类型文档之外,我再次找到了这篇有用的文章

有趣的事实Optional<T>我们刚刚构建类型与官方Partial<T>实用程序类型具有相同的签名

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Typescript中,<T>是什么意思?

什么是-?在TypeScript中是什么意思?

在TypeScript类型定义中,“&”号是什么意思?

TypeScript中的“环境”是什么意思

=〜和/ \在Ruby中是什么意思?

JavaScript中的$和$$是什么意思?

在这些TypeScript声明中,如何解释[keyof T中的p]和T [p]?

Yaml中的<<`和`&`是什么意思?

在Typescript类型定义中,前缀“&”是什么意思?

TypeScript中的双精度类型声明是什么意思?

Angular / Typescript中的<var>语法是什么意思?

Angular / Typescript中的导出*(星号)是什么意思

在TypeScript中,导入或导出为“顶级”是什么意思?

[Prolog]中的[]和[_]是什么意思

Typescript中的static是什么意思?

TypeScript中的枚举名称的`keyof`

在C ++中,^(){}和^ {}是什么意思?

Typescript中的typeof Array [number]是什么意思?

方括号(例如SomeType [])在TypeScript中是什么意思?

#符号在TypeScript类中是什么意思?

类型定义中的右括号后[keyof T]是什么意思?

“ ...” []在Typescript中是什么意思?

“ >>”和“ <<”在python中是什么意思?

<%和%>在javascript中是什么意思?

##和%在shell中是什么意思?

在TypeScript中为“导出”分配值是什么意思?

{} 在 TypeScript 中是什么意思?

TypeScript 中的 `extends A` 和 `extends typeof A` 有什么区别?

'Pick<A & B, keyof A | 和有什么区别 打字稿中的 keyof B> ' 和 'A & B'