一. TS基本数据类型
- number
- 布尔值
- string
- 数组
- 元组
- 枚举
- any
- void
- null和undefined
- never
二. TS基本数据类型说明
- number类型
const age: number = 25
- 布尔值类型
const flag: boolean = 25
- string类型
const name: string = 'wangjiajia'
const value: number | string = 'wangjiajia'
- 数组类型(以number类型数组为例)
const list: number[] = [1,2,3]
const list: Array<number> = [1,2,3]
- 元组tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同
。 比如,你可以定义一对值分别为 string和number类型的元组。当访问一个已知索引的元素,会得到正确类型。
const user: [string,number] = ['wangjiajia',25]
x[0].substr(1)
x[1].substr(1)
x[2] = 'wangtongtong'
x[3] = true
- 枚举:enum
enum Color {Red,Green,Blue}
let c: Color = Color.Green;
enum Color {Red = 1,Green,Blue}
let c: Color = Color.Green;
enum Color {Red = 1,Green = 4,Blue = 8}
enum Sex{male = '男',female = '女'}
let sex: Sex = Sex.female;
enum Sex{male = '男',female}
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
- any类型:表示任一类型,当不清楚变量类型,不希望类型检查器对这些值进行检查而是直接让他们通过编译阶段的检查
const name: any = 'wangjiajia'
- void类型:和any类型相反,表示没有任何类型,一般用于一个函数没有返回值。
function warnUser(): void {
console.log("This is my warning message");
}
const name: viod = undefined
const name: viod = null
- null和undefined:
两者有各自的类型,默认是所有类型的子类型
let u: undefined = undefined;
let n: null = null;
let name: string = undefined | null
- never类型:
表示那些永不存在的值的类型
,never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型;never类型是任何类型的子类型,也可以赋值给任何类型,没有类型是never的子类型或可以赋值给never类型,即使是any也不可以赋值给never。
function error(message: string): never {
throw new Error(message);
}
function fail() {
return error("Something failed");
}
function infiniteLoop(): never {
while (true) {
}
}
let name: never
let age: any = 18
name = age
三. 类型断言
- <类型>值(不能在TSX中使用)
let name: any = "this is a string";
let nameLength: number = (<string>someValue).length;
- 值 as 类型
let name: any = "this is a string";
let nameLength: number = (someValue as string).length;
- 变量!:表示断言这个变量不为null或者undefined
name! 断言name不为null或者undefined
四. 类型别名
- 通过type定义:
type user = {
name: string,
age: number
}
type user2 = user & {
address: string
}
- 通过interface定义
interface user {
name: string,
age: number
}
interface user2 extends user {
address: string
}
interface user {
name: string,
age: number,
address: string
}
- type和interface的区别:
type一旦定义之后就不能在添加新的属性,而interface总是可以扩展的
。
五. 只读属性
interface user {
readonly name: string,
age: number
}
interface user {
readonly name: string,
age: number,
readonly userInfo: {
address:'string'
}
}
六. 泛型
function actionFun<T>(arg:T) :T{}
let output = actionFun<string>("myString");
let output = actionFun("myString");
function actionFun<T>(arg:T) :T{
console.log(arg.length)
}
interface Lengthwise {
length: number;
}
function actionFun<T extends Lengthwise>(arg:T) :T{
console.log(arg.length)
}
loggingIdentity(3)
loggingIdentity({length:10})
function getProperty<T,K>(obj: T, key: K) {
return obj[key];
}
let X = { a: 1, b: 2, c: 3, d: 4 };
getProperty(X,'a')
getProperty(X,'m')