- Tuples
- The unknown type
- Project references
- Default JSX properties
¶Tuples
元组类型用中括号表示,
1 | let product: [string, number]; |
¶JavaScript 的rest扩展语法
在JavaScript中,一个rest
参数就是汇集多个参数以一个参数表示。因此它称为rest
(剩余的、)。不要跟RESTful混淆。
TS中用三个点表示这种rest
参数,
1 | function logScores(...scores) { |
¶Open-ended tuples
结合rest的扩展,tuple可以写成,
1 | type Scores = [string, ...number[]]; |
¶Tuple function parameters
除了rest扩展写法,TS3支持带上参数类型,
1 | function logScores(...scores: [...number[]]) { |
或者,
1 | type Scores = [string, ...number[]]; |
¶Spread expressions
TS3中允许使用扩展语法,
1 | function logScore(score1: number, score2: number, score3: number) { |
但不支持open-ended tuples,因此下面代码编译出错,
1 | const scoresUnlimited: [...number[]] = [75, 65, 80]; |
¶Empty tuples
TS3中可以定义空tuple,
对于类型别名,
1 | type Empty = []; |
声明该类型的一个变量,
1 | const empty: Empty = []; |
如果尝试给该类型指派一个非空值,会出现编译错误,
1 | const notEmpty: Empty = ["Billy"]; |
空tuple可能没什么用,它的主要用处在于作为联合类型(union type)的一部分。
1 | type Scores = [] | [number] | [number, number] | [number, number, number] |
¶可选tuple元素
TS中用?
表示一个可选元素,
1 | type Scores = [number, number?, number?]; |
这样就可以创建带一个到三个元素的变量,
1 | const samScores: Scores = [55]; |
严格来说,TypeScript是把类型看做是“真实的”,因此对应Type Safe的层次也是看做是类型安全的,不匹配的类型将发生编译错误,
1 | const sarahScores: Scores = [95, 50, 75, 75]; // illegal |
¶Unknown type
TS中对未知类型使用unknow
表示,unknown
类型通常和any
类型交替地使用,编译器不会对这种类型进行检查,因此,下面写法是正确的,
1 | function logScores(scores: any) { |
但如果改为,
1 | function logScoresBetter(socres: unknown) { |
立即获得一个编译器警告,带程序依然有效。
¶Type checking with a type redicate
顾名思义,就是用“谓语”对类型作检查,
1 | const scoresCheck = ( |
这里的scores
参数带有类型谓语,scores is { name: string; scores: number[] }
,以确保它包含类型属性name
和scores
。
可以结合类型别名,提高可读性,
1 | type Scores = { name: string; scores: number[] } |
类型谓语属于type guard的一种方式,还有其它几种实现type guard的方式。
¶Type narrowing with a type assertion
类型收缩(type narrowing)类似于Java的强制转换,通过类型断言的方式,使用as
关键实现,
1 | type Scores = { |
¶Project reference
(略) 参考网上tsconfig.json内容,
¶Default JSX properties
在TS3之前,我们必须设置默认的Props属性,并检查是否为null,
1 | interface IProps { |
TS3之后,可以不必要将delimiter
属性设置为optional的,
1 | interface IProps { |
¶问题
- 怎么调用
drawPoint
这个函数,
1 | function drawPoint(x: number, y: number, z: number) { |
-
创建另外一个版本的
drawPoint
,参数用[number, number, number]
实现, -
在问题2中,让
z
是可选的。