TS 考题

1、TS和JS的区别是什么?有什么优势?

语法层面:TypeScript = JavaScript + Type(TS 是 JS 的超集)
执行环境层面:浏览器、Node.js 可以直接执行 JS,但不能执行 TS(Deno 可以执行 TS)
编译层面:TS 有编译阶段(编译成JS),JS 没有编译阶段(只有转译阶段(ES6转到ES5)和 lint 阶段(ESlint提示你代码写的不好))
编写层面:TS 更难写一点,但是类型更安全
文档层面:TS 的代码写出来就是文档,IDE 可以完美提示。JS 的提示主要靠 TS

2、any、unknown、never 的区别是什么?

any V.S. unknown
二者都是顶级类型(top type),任何类型的值都可以赋值给顶级类型变量:

let foo: any = 123; // 不报错
let bar: unknown = 123; // 不报错

但是 unknown 比 any 的类型检查更严格,any 什么检查都不做,unknown 要求先收窄类型:

你把unknown赋值给一个字符产就不行
const value: unknown = "Hello World";
const someString: string = value; 
// 报错:Type 'unknown' is not assignable to type 'string'.(2322)
//如何让它不报错,把value断言将其类型收窄再赋值
const value: unknown = "Hello World";
const someString: string = value as string; // 不报错

如果改成 any,基本在哪都不报错。所以能用 unknown 就优先用 unknown,类型更安全一点。

//不报错
const value: any = "Hello World";
const someString: string = value; 

顶级类型:


顶级类型

可以向上赋值,如果你是一个字符串可以赋值给一个类型是any的变量

never

never 是底类型(never可以赋值给任何类型但是所有值都不能赋值给never,那never存在的意义是什么呢),表示不应该出现的类型,这里有一个尤雨溪给出的例子

interface A {
  type: 'a'
}

interface B {
  type: 'b'
}
//All要么是A类型要么是B类型
type All = A | B

function handleValue(val: All) {
  switch (val.type) {
    case 'a':
      // 这里 val 被收窄为 A
      break
    case 'b':
      // val 在这里是 B
      break
    default:
      // val 在这里是 never,意义就是告诉你别在这写代码
      const exhaustiveCheck: never = val
      break
  }
}

所以never是「不应该出现的类型」

3、type和interface区别是什么?

  • 组合方式:interface 使用 extends 来实现继承,type 使用 & 来实现联合类型。


    image.png
  • 扩展方式:interface 可以重复声明用来扩展并自动合并,type 一个类型只能声明一次


    image.png

    image.png
  • 范围不同:type 适用于基本类型,interface 一般不行。


    image.png
  • 命名方式:interface 会创建新的类型名,type 只是创建类型别名,并没有新创建类型。


    image.png

    Y === number x只是别名

as const 收窄用的


image.png

我没有写类型他会自己猜 a是一个数字字符串
使用as const
类型推断的时候往窄了猜,我的类型必须是 第一项是1 第二项是2 第三项是3


image.png

image.png

4、TS 工具类型的作用和实现?

  • 将英文翻译为中文。
    Partial 部分类型
    Required 必填类型
    Readonly 只读类型
    Exclude 排除类型
    Extract 提取类型
    Pick/Omit 排除 key 类型
    ReturnType 返回值类型

举例说明每个工具类型的用法。

  • Parial部分类型
interface User {
  id:string;
  name:string;
}

表单创建User的时候我们只有name没有id上传到服务器才有id
const user:User = {
  name:'franl'
}//报错 说你需要有id
使用Parial,说明我这个user是User的一部分,其他部分可以不存在。
const user:Partial<User> = {
  name:'franl'
}
  • Required 必填类型(和Partial反着来)
interface User {
  id?:string; //?表示可能不存在
  name:string;
}

const user:Required<User> = {
  name:'franl'
}//报错必须写上id
  • Readonly 只读类型
interface User {
  id:string; 
  name:string;
}

const user:Readonly<User> = {
   id:'111',
  name:'frank'
}
user.id = '222'//报错 只能读不能写
  • Pick/Omit 排除 key 类型
interface User {
  id:string; 
  name:string;
  age:number
}
type God = Pick<User,'id'|'name'>
Pick获取你的某些Key其他都不要
Omit是反向操作 写谁不要谁
type God = Omit<User,'age'>
  • Exclude 排除类型 Extract 提取类型


    Exclude.png
Extract.png

Exclude和Omit区别
Exclude后面接基本类型
Omit后面接一个对象类型 interface

  • ReturnType 返回值类型
    需要获取一个函数的返回值类型。两种写法都行。


    image.png
image.png
  • Record
type a = Record<string,number>
等同于
type b = {
  [x:string]:number
}
所有key都是string 所有value都是number
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容