首页 > 解决方案 > 请解释这个涉及泛型和类型别名的打字稿语法

问题描述

我正在尝试学习一些教程,但我在理解打字稿语法方面遇到了困难。请提供对以下打字稿语法的解释

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上面声明中使用的意义是什么?

还要解释该语句后面的代码块

蒂亚!

标签: typescript

解决方案


对于初学者,“泛型”也称为“参数多态性”,第一个类型参数通常称为“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”的对象并返回一个对象。


推荐阅读