请解释涉及泛型和类型别名的typescript语法

请解释涉及泛型和类型别名的typescript语法,typescript,Typescript,我正在努力学习一些教程,但在理解typescript语法方面有困难。请提供以下typescript语法的解释 1. 上述语句是否为接受类型T并返回ValidationResult的函数定义了类型别名 U代表什么 3. 我知道const fieldValues被分配了一个对象文本,因此fieldValues值将 { name: "Test User", level: 10, description: "Test Description"

我正在努力学习一些教程,但在理解typescript语法方面有困难。请提供以下typescript语法的解释

1. 上述语句是否为接受类型
T
并返回
ValidationResult
的函数定义了类型别名

U
代表什么

3. 我知道
const fieldValues
被分配了一个对象文本,因此
fieldValues
值将

{
    name: "Test User",
    level: 10,
    description: "Test Description"
}
现在,行
type FieldValues=typeof FieldValues平均值

在上述声明中使用
typeof
的意义是什么

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

蒂亚

首先,“泛型”也称为“参数多态性”,第一个类型参数通常称为“T”(对于类型),任何附加参数都只是字母顺序的下一个字符(T、U、V…)

1) 部分类型

允许您使用T的所有属性构造新类型,但它们是可选的,可能会丢失

type ValidationResult<T, U> = Partial<{ [Key in keyof T]: U }>;
2) 功能类型

type Validation<T, U> = (fields: T) => ValidationResult<T, U>; 
这是一个从(数字、字符串)到布尔值的函数。
是一个类型参数,因此它是一个通用lambda

<T>(n: number, T: x) => doSomething...
这只是使用上面的函数并传递一个字符串作为参数。你也可以打电话:

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'类型的对象,然后返回一个对象。

1
type ValidationResult=Partial;
在本例中,
U
是泛型-因此它表示任何类型。在使用类型时定义这些泛型:

type ValidationResult=Partial;
类型TestType={
a:弦,
b:号码,
};
常数x:ValidationResult={
a:‘测试1’,
b:‘测试2’,
};
常数y:验证结果={
a:‘测试1’,
//@ts预期错误
c:‘测试3’,
};
因此,type
ValidationResult
定义了一个类型,该类型将具有type
T
中任意数量的键,并且这些键将具有type
U
的值,无论定义为什么

2.
type-Validation=(字段:T)=>ValidationResult;
你是对的
Validation
是一种函数类型,它接受类型为
T
的一些值,并返回
ValidationResult
<在本例中,当使用类型时,代码>U
的定义如上所述:

type ValidationResult=Partial;
类型TestType={
a:弦,
b:号码,
};
类型验证=(字段:T)=>ValidationResult;
常量f1:Validation=fields=>({a:2,b:3});
//@ts预期错误
常数f2:Validation=fields=>({c:4});

3.
const hasLength=(len:number,input:string|Array)=>
input.length>=len;
const hasUserName=(输入:字符串)=>
hasLength(1,输入)?true:“名称是必需的。”;
(len:number,input:string | Array)
正在定义函数的参数: 1.
len
是一个数字 2.
input
string
Array
的联合类型;也就是说,它要么是字符串,要么是某种类型的数组
T
;这两种类型都具有可使用的
length
属性

前导的
T
是泛型;它代表某种类型;我们只是说我们不想定义函数中的类型,它可以是任何类型

hasLength
hasUserName
之间的关系是后者使用前者来检查用户名是否至少是一个聊天者。Typescript可以知道当
hasUserName
调用
hasLength
并将
input
作为第二个参数时,
hasLength
中的
T
将是一个字符串

4.
const字段值={
名称:“测试用户”,
级别:10,
描述:“测试描述”
};
类型FieldValues=类型FieldValues;
常量验证规则=[
({name}:FieldValues)=>({
姓名:hasUserName(姓名)
}),
({description}:FieldValues)=>({
描述:hasValidDescription(描述)
})
];
typeof
是采用值类型的typescript关键字。因此,
FieldValues
实际上是一种如下所示的类型:

类型字段值={
名称:字符串;
级别:数字;
描述:字符串;
};

下一个代码块定义了一个函数数组,该数组接受
字段值
对象,并返回一个对象。对象上的键指示
字段值
对象是否对某些属性有效。我猜他们用它来验证许多字段。

是否
({name}:FieldValues)
表示对象的解构…?你能解释一下为什么他们用括号括起来吗<代码>=>({name:hasUserName(name)})?为什么不
=>{name:haseusername(name)}
?@blogs4t当然-这部分是相当标准的javscript,没有括号,你会得到一个语法错误;您必须拥有它们才能返回对象
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!
type Validation<T, U> = (fields: T) => ValidationResult<T, U>; 
const hasLength = <T>(len: number, input: string | Array<T>) =>
input.length >= len;
(len: number, input:string) => input.length >= len
<T>(n: number, T: x) => doSomething...
const hasUserName = (input: string) =>
hasLength(1, input) ? true : "Name is required.";
hasLength(1, ['a', 'b'])
const validationRules = [
    ({ name }: FieldValues) => ({
        name: hasUserName(name)
    }),
    ({ description }: FieldValues) => ({
        description: hasValidDescription(description)
    })
];