[{"data":1,"prerenderedAt":312},["ShallowReactive",2],{"content:\u002Fposts\u002F2024\u002Fts-basic-type":3,"surround:\u002Fposts\u002F2024\u002Fts-basic-type":301},{"id":4,"title":5,"body":6,"canonical":281,"categories":282,"date":284,"description":281,"draft":285,"extension":286,"image":287,"meta":288,"navigation":289,"path":290,"permalink":281,"readingTime":291,"recommend":281,"references":281,"seo":296,"sitemap":297,"stem":298,"tags":299,"type":281,"updated":284,"__hash__":300},"content\u002Fposts\u002F2024\u002Fts-basic-type.md","TypeScript 基本数据类型",{"type":7,"value":8,"toc":265},"minimark",[9,16,20,35,45,56,62,65,68,74,77,87,93,96,99,105,108,114,120,125,133,136,139,149,155,158,164,168,174,177,183,186,189,195,198,201,207,212,228,234,238,241,247,250,256,259],[10,11,12],"blockquote",{},[13,14,15],"p",{},"包含了对断言、never、void 等类型的说明",[17,18,19],"h2",{"id":19},"基本类型",[13,21,22,23,27,28,27,31,34],{},"定义数据类型，基本数据类型中包含 ",[24,25,26],"code",{"code":26},"string"," ",[24,29,30],{"code":30},"number",[24,32,33],{"code":33},"boolean"," 等",[36,37,43],"pre",{"className":38,"code":40,"language":41,"meta":42},[39],"language-ts","const name: string = \"whbbit\" \u002F\u002F name 的值只能是字符串类型\nconst age: number = 25 \u002F\u002F age的值只能是数值类型\nconst work: boolean = false \u002F\u002F work的值只能是true\u002Ffalse\n\nlet stringArr: string[] \u002F\u002F 数组里的值只能是字符串\n\nlet obj1: object \u002F\u002F obj1必须是一个对象\nlet obj: { name: string, age: number } \u002F\u002F obj这个对象中只能包含name和age属性，且类型必须是规定的类型\n","ts","",[24,44,40],{"__ignoreMap":42},[13,46,47,48,51,52,55],{},"在 ",[24,49,50],{"code":50},":"," 前添加 ",[24,53,54],{"code":54},"?"," 表示这个值不是必填",[36,57,60],{"className":58,"code":59,"language":41,"meta":42},[39],"const obj1: { name: string, age: number, work: boolean } = {\n    name: \"whbbit\",\n    aage: 25,\n}\nconsole.log(obj1) \u002F\u002F 编译时会有报错，Property 'work' is missing in type '{ name: string; age: number; }' but required in type '{ name: string; age: number; work: boolean; }'.\n\nconst obj: { name: string, age: number, work?: boolean } = {\n    name: \"whbbit\",\n    age: 25,\n}\nconsole.log(obj)\n",[24,61,59],{"__ignoreMap":42},[17,63,64],{"id":64},"类型自动推断",[13,66,67],{},"在不写类型时，ts 会自动进行类型推断",[36,69,72],{"className":70,"code":71,"language":41,"meta":42},[39],"const name = \"whbbit\" \u002F\u002F 等同于 -> let name: string = 'whbbit'\n",[24,73,71],{"__ignoreMap":42},[17,75,76],{"id":76},"类型组合",[13,78,79,80,83,84,86],{},"使用 ",[24,81,82],{"code":82},"|"," 表示类型可以多选，符合 ",[24,85,82],{"code":82}," 之前或者之后的类型即可",[36,88,91],{"className":89,"code":90,"language":41,"meta":42},[39],"let a: string | number \u002F\u002F 表示a可以是字符串也可以是一个数值\na = \"whbbit\"\na = 20\n\nlet b: string | number | boolean\nb = \"whbbit\"\nb = 20\nb = false\n\nconst arr: (string | number)[] = [] \u002F\u002F 数组内容只能为字符串或数值类型\nconst arr1: Array\u003Cstring | number> = [] \u002F\u002F 使用泛型\n",[24,92,90],{"__ignoreMap":42},[17,94,95],{"id":95},"any",[13,97,98],{},"在我们不知道是什么类型时，可以定义为 any 类型。对类型不做校验",[36,100,103],{"className":101,"code":102,"language":41,"meta":42},[39],"let a: any\na = \"whbbit\"\na = 10\na = false\na = [\"whbbit\"]\n\nlet arr: Array[any]\nlet arr1: any[]\n",[24,104,102],{"__ignoreMap":42},[13,106,107],{},"也可以对构造函数生成的实例进行类型限制。",[13,109,110],{},[111,112,113],"strong",{},"不推介这样做，class 的类型推断和限制就没有了，不符合使用 ts 的场景",[36,115,118],{"className":116,"code":117,"language":41,"meta":42},[39],"class Animal {\n    constructor() {}\n    get = () => \"weilog.me\"\n}\n\nconst cat: any = new Animal()\n",[24,119,117],{"__ignoreMap":42},[121,122,124],"h3",{"id":123},"对配置文件改动取消对-any-类型的自动推断","对配置文件改动，取消对 any 类型的自动推断",[36,126,131],{"className":127,"code":129,"language":130,"meta":42},[128],"language-json","{\n  \"noImplicitAny\": true,\n}\n","json",[24,132,129],{"__ignoreMap":42},[17,134,135],{"id":135},"unknown",[13,137,138],{},"unknown 和 any 的区别",[140,141,142,146],"ul",{},[143,144,145],"li",{},"unknown 表示有类型但是不明确类型是什么，ts 会进行类型的判断",[143,147,148],{},"any 表示这个值没有类型，ts 不会进行类型的判断",[36,150,153],{"className":151,"code":152,"language":41,"meta":42},[39],"let a: any\nconst a1: string = a \u002F\u002F 不会进行报错，ts不做类型校验\n\nlet b: unknown\nconst c: string = b \u002F\u002F ts校验报错，类型不匹配\n",[24,154,152],{"__ignoreMap":42},[13,156,157],{},"可以使用 as 断言来解决",[36,159,162],{"className":160,"code":161,"language":41,"meta":42},[39],"let b: unknown\nconst c: string = b as string \u002F\u002F 断言变量b一定是一个string类型的值\n",[24,163,161],{"__ignoreMap":42},[17,165,167],{"id":166},"断言是什么-怎么用","断言是什么? 怎么用?",[36,169,172],{"className":170,"code":171,"language":41,"meta":42},[39],"const a: string = \"20\"\nconst b: number = a as number \u002F\u002F 会报错，不能对已经声明类型的值进行断言\n",[24,173,171],{"__ignoreMap":42},[13,175,176],{},"怎么解决这种问题呢？ 我们可以先将 b 转换为 unknown 类型再断言",[36,178,181],{"className":179,"code":180,"language":41,"meta":42},[39],"const a: string = \"20\"\nconst b: number = a as unknown as number\n",[24,182,180],{"__ignoreMap":42},[17,184,185],{"id":185},"void",[13,187,188],{},"void 可以是 null 或 undefined，多用于函数返回值的类型",[36,190,193],{"className":191,"code":192,"language":41,"meta":42},[39],"let a: void = null\na = undefined\n",[24,194,192],{"__ignoreMap":42},[17,196,197],{"id":197},"never",[13,199,200],{},"never 不是任何类型，在函数不能执行到结尾时进行类型推断",[36,202,205],{"className":203,"code":204,"language":41,"meta":42},[39],"function err(): never {\n    throw new Error(\"err\")\n}\n",[24,206,204],{"__ignoreMap":42},[13,208,209],{},[111,210,211],{},"void 和 never 的区别",[140,213,214,221],{},[143,215,216,217,220],{},"void 常用作函数的返回值的推断，",[111,218,219],{},"函数没有返回值","时，可以将返回类型写为 void",[143,222,223,224,227],{},"never 常用作 ",[111,225,226],{},"函数不能执行到末尾"," 时对函数类型的限制",[36,229,232],{"className":230,"code":231,"language":41,"meta":42},[39],"function printString(content: any): void {\n    console.log(content)\n}\n\nfunction throwError(err): never {\n    throw new Error(err)\n}\n",[24,233,231],{"__ignoreMap":42},[17,235,237],{"id":236},"null-undefined","null & undefined",[13,239,240],{},"null 和 undefined 代表的类型就是 js 中对应的 null 和 undefined",[36,242,245],{"className":243,"code":244,"language":41,"meta":42},[39],"const a: null = null\nconst b: undefined = undefined\n",[24,246,244],{"__ignoreMap":42},[13,248,249],{},"默认情况下 null 和 undefined 可以作为其他类型的值",[36,251,254],{"className":252,"code":253,"language":41,"meta":42},[39],"let a: string\na = null\na = undefined\n\u002F\u002F 这时不会报错\n",[24,255,253],{"__ignoreMap":42},[13,257,258],{},"可以修改 tsconfig.json 文件中的配置让其不能作为其他类型的值",[36,260,263],{"className":261,"code":262,"language":130,"meta":42},[128],"{\n  \"strictNullchecks\": true,\n}\n",[24,264,262],{"__ignoreMap":42},{"title":42,"searchDepth":266,"depth":266,"links":267},4,[268,270,271,272,276,277,278,279,280],{"id":19,"depth":269,"text":19},2,{"id":64,"depth":269,"text":64},{"id":76,"depth":269,"text":76},{"id":95,"depth":269,"text":95,"children":273},[274],{"id":123,"depth":275,"text":124},3,{"id":135,"depth":269,"text":135},{"id":166,"depth":269,"text":167},{"id":185,"depth":269,"text":185},{"id":197,"depth":269,"text":197},{"id":236,"depth":269,"text":237},null,[283],"代码","2024-03-16 23:59:14",false,"md","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F679adb4c34f00-78.webp",{},true,"\u002Fposts\u002F2024\u002Fts-basic-type",{"text":292,"minutes":293,"time":294,"words":295},"5 min read",4.595,275700,919,{"title":5,"description":281},{"loc":290},"posts\u002F2024\u002Fts-basic-type",[],"NPk0-65nRuzcv-Rh4wmL09pT1BLQKpFU0XukM6QrZWI",[302,307],{"title":303,"path":304,"stem":305,"date":306,"type":281,"children":-1},"事件循环 \u002F EventLoop","\u002Fposts\u002F2024\u002Fjs-eventloop","posts\u002F2024\u002Fjs-EventLoop","2024-03-16 23:56:14",{"title":308,"path":309,"stem":310,"date":311,"type":281,"children":-1},"TypeScript 断言","\u002Fposts\u002F2024\u002Fts-as","posts\u002F2024\u002Fts-as","2024-03-17 00:14:35",1789642592504]