TypeScript浅学习总结(一)

162 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

换了工作,新公司要用react + ts,对于之前没有接触过react和ts的我来说,一切要从头学习,以下是本菜鸡的一些学习ts的总结,有不足的地方欢迎指正~:

简介:

TypeScript 是 JavaScript 的超集,这意味着它可以完成 JavaScript 所做的所有事情,它可以编译成纯JavaScript。

为什么需要ts?

JavaScript是一种动态类型语言,更改值的时候也可以更改他的类型,所以通过typeScript来给JavaScript添加静态类型,避免类型的更改和防止bug。

一、ts的类型:
  • 布尔值:boolean
  • 数值:number
  • 字符串:string
  • 数组:[]
  • 元组Tuple: 允许表示一个已知元素数量和类型的数组,各元素的类型不必相同
  • 枚举
  • any
  • void
  • null 和 undefined
  • never
  • object

其中,boolean,number,string都是比较好理解的,

1、数组:可以这样定义:
let x:number[];
x = [1,2,3];
// x这个数组里面的值只能为number类型

也可以通过泛型来定义
let x:Array<number> = [12,4,5];
2、元组可以看下面的例子:
let x: [number, string];
// 定义了分别为number和string的元组
x = [10, 'ten']; //ok
x = ['hello', 20]; // error
3、其中还可以使用联合类型, | 来定义多种类型
let x: (number | string)[] = [1, 'hh', 3];
4、any: 使用any等同于没有使用ts了,要尽量避免使用any
5、void表示没有任何返回值,当一个函数没有返回值的时候,可以使用void:
interface someProps {
  sayHello: () => void;
}
6、null 和 undefined

在某处你想传入一个 stringnullundefined,你可以使用联合类型string | null | undefined

7、never表示永不存在的值的类型,

我木有怎么用到...

8、对象

定义对象的时候一般使用interface,可以帮助我们检查多个对象是否具有相同的特定属性和值类型:

interface obj {
    name: string;
    age: number;
}
const item1:obj = {
    name: '小明',
    age: 25,
}
二、interface和type

在大多数情况下,我都是interface和type混着用的,他们好像区别不大

interface Props {
    name: string;
    age: number;
    sex: string;
    habbit: string[];
}

type Props = {
    name: string;
    age: number;
    habbit: string[];
}

// 以上两种写法没有区别

type和interface都可以拓展, 使用extends:

拓展interfance

interface newProps extents Props {
    sex: string;
}

cosnt obj:newProps = {
    name: '王二狗',
    age: 13,
    habbit: ['baseball'],
    sex: '男'
}

拓展type

type newProps = Props & {
    family: string;
}
const obj2: newProps = {
    name: '李二狗',
    age: 17,
    habbit: ['baseball'],
    sex: '女'
}

总的来说,不知道用啥的时候可以先用interface

三、泛型

T 被称为类型参数,一般写作 泛型用于返回值的类型与传入参数的类型的对应关系,它是一种特殊的变量,只用于表示类型而不是值。

例子:

const verify = <T>(obj: T):T => {
   return obj
}
// 表示传入的值和返回的值都一样

当这样写时: 会报错,因为T没有限定它的特定类型,比如传一个number会报错

const verify = <T>(val: T) => {
   return val.length
}

需要进行这样的改写来进行泛型约束:

const verify = <T extends String>(val: T) => {
   return val.length
}

verify('hello! my boy') //
四、?可选链式符

在函数中,参数是选传的,可以在后面跟一个?,例如:

const fn = (index: number, code?: string) => {...}
fn(3) 

不传code这个参数也不会报错