We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
类的实例成员
类的方法
函数参数
函数返回值
function identity(value) { return value } console.info(identity(1)) // 1
identity
TypeScript
Number
function identity(value: Number): Number { return value } console.info(identity(1)) // 1
any
// 🚀🚀🚀 Step - 3 function identity3<T>(value: T): T { return value }
上面的图片中, 当我们调用identity<Number>(1),Number类型就像参数1一样, 它将出现在T的任何位置填充该类型. 图中<T>内部的T被称为类型变量, 它是我们希望传递给identity函数的类型占位符. 同时它被分配给value参数用来代替它的类型, 此时 T充当的是类型, 而不是特定的Number类型
identity<Number>(1)
1
T
<T>
类型变量
value
Number类型
其中T代表Type, 在定义泛型时通常用作第一个类型变量名称. 但实际上T可以用做任何有效名称代替, 除了T之外,以下是常见泛型变量代表的意思
Type
K(Key): 表示对象中的键类型
K(Key)
V(Value): 表示对象中的值类型
V(Value)
E(Element): 表示元素类型
E(Element)
其实并不是只能定义一个类型变量, 我们可以引入希望定义的任何数量的类型变量. 比如我们引入一个新的类型变量U, 用于扩展定义我们的identity函数
U
function identity4<T, U>(value: T, message: U): T { console.info(message) return value } console.log(identity4<Number, string>(68, 'Semlinker'))
function identity5<T, U>(value: T, message: U): T { console.info(message) return value } console.log(identity5(68, 'Semlinker'))
function identity <T, U>(value: T, message: U) : T { console.log(message); return value; }
元组
function identity6<T, U>(value: T, message: U): [T, U] { console.info(message) return [value, message] } console.log(identity6(68, 'Semlinker'))
Identities
interface Identities<V, M> { value: V message: M }
V
M
interface Identities<V, M> { value: V message: M } function identity<T, U>(value: T, message: U): Identities<T, U> { console.info(`${value}: ${typeof value}`) console.info(`${message}: ${typeof message}`) let identities: Identities<T, U> = { value, message, } return identities } console.info(identity<Number, String>(68, 'finder'))
// 68: number // Semlinker: string // {value: 68, message: "Semlinker"}
interface PersonInterface<U> { value: U getIdentity: () => U } class IdentityClass<T> implements PersonInterface<T> { value: T constructor(value: T) { this.value = value } getIdentity(): T { return this.value } } const p1 = new IdentityClass<string>('Leslie') console.info(`p1 value ${p1.value}`) // p1 value Leslie console.info(`p1.getIdentity() ${p1.getIdentity()}`) // p1.getIdentity() Leslie const p2 = new IdentityClass<number>(1943) console.info(`p2 value ${p2.value}`) // p2 value 1943 console.info(`p2.getIdentity() ${p2.getIdentity()}`) // p2.getIdentity() 1943
p1
IdentityClass
string
Leslie
String
PersonInterface<T>
PersonInterface<String>
PersonInterface<U>
泛型类
Typescript
React
type Props = { className?: string ... }; type State = { submitted?: bool ... }; class MyComponent extends React.Component<Props, State>{}
props
state
函数
接口
类
The text was updated successfully, but these errors were encountered:
No branches or pull requests
TypeScript: 读懂 TypeScript 泛型及应用
🚀 泛型是什么?
类的实例成员
,类的方法
,函数参数
和函数返回值
identity
函数做适当的调整, 以支持TypeScript
的Number
类型的参数:identity
的问题是我们将Number
类型分配给参数和返回类型, 使该函数仅可用于该原始类型. 但该函数并不是可扩展或通用的, 很明显这并不是我们所希望的.Number
换成any
, 我们失去了定义应该返回哪种类型的能力, 并且在这个过程中使编译器失去了类型保护的作用. 我们的目标是让identity
函数可以适用于任何特定的类型, 为了实现这个目标, 我们可以使用泛型来解决这个问题, 具体实现方式如下TypeScript
泛型的读者来说, 首次看到 语法会感到陌生. 但这没什么可担心的, 就像传递参数一样, 我们传递了我们想要用于特定函数调用的类型.上面的图片中, 当我们调用
identity<Number>(1)
,Number
类型就像参数1
一样, 它将出现在T
的任何位置填充该类型. 图中<T>
内部的T
被称为类型变量
, 它是我们希望传递给identity
函数的类型占位符. 同时它被分配给value
参数用来代替它的类型, 此时T
充当的是类型, 而不是特定的Number类型
其中
T
代表Type
, 在定义泛型时通常用作第一个类型变量名称. 但实际上T
可以用做任何有效名称代替, 除了T
之外,以下是常见泛型变量代表的意思K(Key)
: 表示对象中的键类型V(Value)
: 表示对象中的值类型E(Element)
: 表示元素类型其实并不是只能定义一个类型变量, 我们可以引入希望定义的任何数量的类型变量. 比如我们引入一个新的类型变量
U
, 用于扩展定义我们的identity
函数identity
函数:identity
函数, 新的identity
函数增加了一个类型变量U
, 但该函数的返回类型我们仍然使用T
. 如果我们想要返回两种类型的对象该怎么办呢?针对这个问题, 我们有多种方案, 其中一种就是使用元组
, 即为元组
设置通用的类型:🚀 泛型接口
identity
函数通用Identities
接口:Identities
接口中, 我们引入了类型变量V
和M
, 来进一步说明有效的字母都可以用于表示类型变量, 之后我们就可以将Identities
接口作为identity
函数的返回类型:🚀 泛型类
p1
的调用过程IdentityClass
的对象是, 我们传入string
类型和构造函数参数值Leslie
;IdentityClass
类中, 类型变量T
的值变成String
类型IdentityClass
类实现了PersonInterface<T>
,而此时T
表示String
类型,因此等价于该类实现了PersonInterface<String>
接口PersonInterface<U>
来说, 类型变量U
变成了String
. 这里有意使用不同的变量名, 以表明类型值沿链向上传播, 且与变量名无关.泛型类
可确保在整个类中一致地使用指定的数据类型. 比如, 你可能已经注意到在使用Typescript
的React
项目中使用了以下约定:React
组件一起使用, 以确保组件的props
和state
是类型安全的.函数
,接口
或类
将处理多种数据类型时.函数
,接口
或类
在多个地方使用该数据类型时.The text was updated successfully, but these errors were encountered: