TypeScript学习笔记——常用类型

317 阅读3分钟

一、TypeScript的类型

typeScript常用的八种类型:number、string、boolean、函数、array、any(不建议使用)、void、object。

1.number

数字类型,包含小数、其他进制的数值

let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
let big: bigint = 100n;

2.string

字符串

let background: string = 'red' | "red"

3.array

在TS中,array一般指所用类型元素的集合的值的集合,比如:

let list: Array<number> = [1,2,3];
// or
let list: number[] = [1,2,3]
// or
interface User {
  name:string
}
const john:User = {name: 'john'};
const jack:User = {name:'jack'}
let personList: Array<User> = [john,jack] //这里的john和jack都是User类型

和这种混合类型的“数组”

let l = ['jack',10]

在TS中不是数组/array,它们叫作tuple(元组)

4.boolean

布尔值

let isDone: boolean = false

5.函数

两种方法

1.在我们熟悉的“JS函数”上直接声明参数和返回值:

const isFaly = (value: any): boolean =>{
  return value === 0 ?ture: !value
}

2.直接声明想要的函数类型

export const useMount = (fn: ()=>void) => {
  useEffect(()=>{
    fn();
  },[])
}


const isFalsy: (value:any) => boolean = (value) => {
  return value === 0 ?true :!value;
}

6.any

any表示这个值可以是任何值,被定义为any就意味着不做任何类型检查

let loosedType:any = 4;
// loosedType 明明是一个数值4 哪里存在ifItExists方法呢?
// 由于声明为any,我们没法在静态检查阶段发现这个错误
loosedType.ifItExists();

刚开始学习TS时候,很多时候为了避免TS不在报错,因此喜欢使用any类型。但是这样是不对的,导致失去TS的类型保护。

7.void

绝大部分情况下,只会用在这一个地方:表示函数不返回任何值 或者返回undefined(函数不返回任何值 === 返回undefined)

export const useMount = (fn:()=>void) =>{
  useEffect(()=>{
    fn()
  },[])
}

8.object

除了number、bigint、string、symbol、boolean、null、undefined、其他都是object

9.tuple

tuple是一个“数量固定、类型可以各异”的数组

let data:[number,string] = [1,'tuple'];
// 如果你对React有了解的话 useState就是一个很好地tuple返回类型
const [state,setState] = useState([]);
// 在React自定义hook返回值的时候很有可能用到tuple,体现tuple的便于使用者重命名的好处
const useHappy = () =>{
  //....
  return [isHappy,makeHappy,makeUnhappy]
}
const SomeComponent = ()=>{
  const [tomIsHappy,makeHappy,makeUnhappy] = useHappy()
  // ....
}

10.enum

枚举数据类型,可以通过他们的key来进行取值。

enum Color{
  Red,
  Green,
  Blue
}
let red:Color = Color.Red;
let blue:Color =Color[2]

11.null 和 undefined

null 和 undefined既是数据值也是TS的数据类型

let u: undefined = undefined;
let n: null =null;

12.unknown

unknown表示这个值可以是任何值。unknown的用法:在你想用any的时候,用unknown来代替。unknown是严格版的any。(unknown类型值不可以赋给任何值)

const isFalsy = (value:unknown) =>{
  // 对比上面的any 考虑这个console会不会报错
  console.log(value.mayNotExist)
  return value === 0?true:!value
}

13.never

never表示永不存在的值的类型。例如,never类型是那些总是会抛出异常或者根本就没有返回值的函数。

// 这个func返回的就是never类型,never用到的比较少。

14.interface

interface不是一种类型,应该被翻译成接口,或者说使用上面介绍的类型,创建一个自己的类型。

interface User {
  id:number,
  name:string
}

啥时候需要声明类型

理论上来说在我们声明任何变量的时候都需要声明类型(包括普通类型、函数、组件、hook、等等)。声明函数、组件、hook等需要声明参数和返回值的类型。

但是在很多情况下,TS可以帮我们自动推断。比如:

// 给定一个确定的类型值。这里虽然没有显示声明类型,但是TS推断这是个number类型
let a=1
// 自动推断返回值为number
function add(a: number,b:number){
  return a+b;
}
// 自动判断返回值为boolean
const isFalsy =(value:unknown) =>{
  retuen value ===0 ?ture :!value
}

.d.ts

JS文件 + .d.ts文件 ===ts文件

.d.ts文件自定义类型说明文件,可以让JS文件类型文件说明继续保持js文件身份,但依然可以享受TS的类型保护。