类型断言、类型声明
# 类型断言
ts是强类型,在声明变量的时候,我们必须给他一个类型 具体类型: TypeScript允许你覆盖它的推断,并且能以你任何你想要的方式分析它。类型断言有两种语法,as语法和尖括号语法。
const p: unknown = 'a,b,c';
p.split(','); // 报错:Object is of type 'unknown'.
unknown类型的p直接这样写会报错,可以使用类型断言:
- 写法一:
(p as string).split(',');
- 写法二:
(<string>m).split(',');
注意:
在使用TypeScript和JSX的时候,只有as语法可以用,在APP.tsx中尝试使用(<string>m).split(',');会报错:
Property 'string' does not exist on type 'JSX.IntrinsicElements'.
JSX element 'string' has no corresponding closing tag.
因为<string>被当成HTML元素来处理了,但是有没有找到对应的元素。
# 类型声明
interface、type、declare、class都可以声明类型
# interface/type
interface侧重于描述数据结构,type侧重于描述类型 区别:
- type alias 可以重命名原始类型,interface不可以:
type Num = number;
// interface 不行
- interface可以进行声明合并, type alias不可以:
interface Mammal {
genus: string
}
interface Mammal {
breed: string
}
// 前面两个interface被合并成一个同时具有genus和breed属性的类型
const animal: Mammal = {
genus: "1234",
// Fails because breed has to be a string
breed: '2'
}
type Reptile = {
genus: string
}
// type一旦被声明,不能再加新属性
type Reptile = {
breed?: string
}
# extends/implements
extends
- extends 类似于 es6 class 对应的extends
- 实现类的继承 class Son extends Father {}
- 实现和接口的继承
interface ISon extends IFather {
sonValue: number; // ISon上除了从IFather继承的属性,还增加了sonValue
}
implements
- 类与类之间 class Son implements Father {} // 用于类之间,此时没有继承的效果,而是要求Son上要有定义Father类的属性和方法
- 类与接口之间: class Son implements IFather {} //用接口去规范class,要求Son上的属性和方法按照IFather接口中定义来 示例:
interface ManLike {
speak(): void;
leg: number;
hand: number;
}
class Human implements ManLike {
leg: number = 2;
hand: number = 2;
speak() {
console.log('i can speak');
}
}
interface Chinese extends Human {
country: string;
}