typescript - 请解释这个涉及泛型和类型别名的打字稿语法
问题描述
我正在尝试学习一些教程,但我在理解打字稿语法方面遇到了困难。请提供对以下打字稿语法的解释
1
type ValidationResult<T, U> = Partial<{ [Key in keyof T]: U }>;
我在打字稿手册的泛型章节中找不到描述<T, U>
上述陈述部分内容的示例 - 这是什么意思?是T
输入U
还是输出?
我理解部分但似乎无法理解Partial<{ [Key in keyof T]: U }>
请解释它的含义
2
type Validation<T, U> = (fields: T) => ValidationResult<T, U>;
T
上面的语句是否为接受类型并返回的函数定义了类型别名ValidationResult<T, U>
?
代表什么U
?
3
const hasLength = <T>(len: number, input: string | Array<T>) =>
input.length >= len;
const hasUserName = (input: string) =>
hasLength(1, input) ? true : "Name is required.";
代表什么<T>(len: number, input: string | Array<T>)
?
<T>
上述声明中的领先是什么意思?
你能解释一下上述两个声明的含义吗?
const hasLength
上面两个声明和有什么关系const hasUserName
?
4
const fieldValues = {
name: "Test User",
level: 10,
description: "Test Description"
};
type FieldValues = typeof fieldValues;
const validationRules = [
({ name }: FieldValues) => ({
name: hasUserName(name)
}),
({ description }: FieldValues) => ({
description: hasValidDescription(description)
})
];
我知道const fieldValues
分配了一个对象文字,因此fieldValues
值将是
{
name: "Test User",
level: 10,
description: "Test Description"
}
现在,这条线type FieldValues = typeof fieldValues;
是什么意思?
typeof
上面声明中使用的意义是什么?
还要解释该语句后面的代码块
蒂亚!
解决方案
对于初学者,“泛型”也称为“参数多态性”,第一个类型参数通常称为“T”(用于 Type),任何附加参数只是按字母顺序排列的下一个字符(T、U、V...)。
1) 部分类型
部分类型允许您构造一个新类型,具有 T 的所有属性,但它们是可选的并且可能会丢失。
type ValidationResult<T, U> = Partial<{ [Key in keyof T]: U }>;
这意味着,“我从 T 创建了一个具有类型 U 的所有属性的类型”。例如ValidationResult<MyType, string>
将包含来自“MyType”的所有字符串属性。
注意:这[name-expression]: type
称为“计算属性”。
interface Test{
foo: string,
bar: number
}
type ValidationResult<T, U> = Partial<{ [Key in keyof T]: U }>;
let v: Baz<Test, string> = { foo: 't', bar: 1 }; // Error! bar is not a string!
2) 功能类型
type Validation<T, U> = (fields: T) => ValidationResult<T, U>;
'Validation' 是一个函数类型,它采用某种类型 T 并返回一个部分类型,该类型包含 T 中具有类型 U 的所有属性。
所以返回类型就是我们之前定义的,但是这个函数只是给了我们这些ValidationResults之一。
3) 联合类型和匿名函数
const hasLength = <T>(len: number, input: string | Array<T>) =>
input.length >= len;
所以这是一个匿名函数(或“lambda”):
(len: number, input:string) => input.length >= len
这是一个从(数字,字符串)到布尔值的函数。这<T>
是一个类型参数,所以它是一个通用的 lambda!
<T>(n: number, T: x) => doSomething...
表单的类型string | number | T
是联合类型,即它可以采用每个列出的类型中允许的任何值:'abc' 或 123 或任何 T 是...
所以'hasLength'是一个(lambda)函数,它将'len'与字符串或Ts参数数组的长度进行比较。
const hasUserName = (input: string) =>
hasLength(1, input) ? true : "Name is required.";
这只是使用上述函数并将字符串作为参数传递。您也可以致电:
hasLength(1, ['a', 'b'])
那是'hasLength of number,Array'。
4) 匿名类型
所以就像你说的,我们将一个对象文字分配给我们的常量。但是常量的类型是什么?最通用的可能是“对象”,但这根本没有用!
'typeof' 运算符为我们提供了对象的类型。即使我们从未定义过接口或类,也没有给这个对象命名,我们已经将它的(未命名的)类型放入变量“FieldValues”中。然后我们可以使用该类型:
const validationRules = [
({ name }: FieldValues) => ({
name: hasUserName(name)
}),
({ description }: FieldValues) => ({
description: hasValidDescription(description)
})
];
[]
这是一个包含函数的数组(参见 参考资料)。该函数使用一种公认的奇怪语法来表示,它接受一个名为“name”、类型为“FieldValues”的对象并返回一个对象。
推荐阅读
- android - 可以使用 setOffscreenPageLimit(0) 的自定义 ViewPager
- java - 泛型 - “捕获”不能应用于“?”
- image - 在 UIAxes 中覆盖具有透明度的图像
- java - 在用户名或用户电子邮件等属性下使用@Id 注释是否是一种好习惯
- java - Spring:调用 new ClassPathXmlApplicationContext() 时出现 FileNotFoundException
- c - 凯撒密码负数问题
- php - 如何将贝宝集成到我的 php 项目中?
- spagobi - 在 Spago BI 报告中的文档选项卡之间切换时出现错误
- gradle - 如何在库 jar 中打包扩展功能?
- kubernetes - MacO 上的 gRPC 网络连接到运行 Istio 的 Kubernetes