一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。(juejin.cn/post/705288… "juejin.cn/post/705288…
1. 运行环境
- 安装node.js
- vscode
setting quote
缩进改为2
安装插件prettier
转换为js 代码
在原有的基础上安装ts 就会安装最新的
npm install typescript -g //全局安装
tsc --version //查看版本
- 测试ts
tsc 文件.js 报错
1.管理员身份运行vs code
2.在终端执行:get-ExecutionPolicy,显示Restricted
3.在终端执行:set-ExecutionPolicy RemoteSigned
4.在终端执行:get-ExecutionPolicy,显示RemoteSigned
使用 tsc 命令转成 js 文件
编译成功 导入到index。html 在浏览器打开
编译时报错:
ts 文件会存在同一个作用域
加上export {} 文件独立作用域
搭建ts运行环境
1.安装ts-node
npm install ts-node -g
还依赖两个包
npm install tslib @types/node -g
2.第二种webpack运行: cmd 一定要管理员身份打开 不然会报错!!!
npm install webpack -g
npm install webpack-cli -g
进入到webpack文件夹 npm init
npm install webpack webpack-cli -d
本地安装
npm install ts-loader typescript -D
生成配置文件:
tsc --init
接口 interfaces
enum 迭代类型:
定义一个对象保存:
等同于:
他们的下标是 0 1 2
也可以改变默认值
注意:
函数的泛型
//需求 规定两个参数只能穿字符串 或者是 数字
// function join(first: string | number, second: string | number) {
// return `${first}${second}`;
// }
// join("s", 2);
// join(2, 2);
// join("df", "df");
function join<ABC>(first: ABC, second: ABC) {
return `${first}${second}`;
}
join<string>("sd", "dfs");
join<number>(12, 12);
// 输入的参数为数组 内容为字符串
function map<ABC>(params: ABC[]) {
return params;
}
map<string>(["123"]);
// map<string>([123]); 报错
//等价于:
function mapSecond<ABC>(params: Array<ABC>) {
return params;
}
mapSecond<string>(["123"]);
// 一般用T代表泛型
// 定义多个泛型
function foo<T, P>(first: T, second: P) {
return `${first}${second}`;
}
foo(1, "1"); // 可以不用加说明 js底层会推断出
foo<number, string>(12, "xczxc");
function fooOne<T, P>(first: T, second: P): P {
return second;
}
fooOne(1, 12);
fooOne("sds", "sdas");
fooOne("sds", 154);
类里面的泛型:
命名空间:(类似于模块化 把需要用到的内容封装在一起去 把最核心的暴露出去 )
运行在浏览器中:
1.创建ts文件夹
2.npm init -y
3.tsc -init 创建出 tsconfig.json
4.src 下创建 src文件夹 再添加 page.ts文件(打印abc) src下创建dist文件夹 5.根目录下 添加index.html 引入
6.最后在 tsconfig.json 打开 输入 输出的地址:
最后在控制台 tsc 跑起来 右击index.html 在浏览器上看到
修改一次 page.ts 就需要 tsc 一次 采用tsc -w 只要有改动 就会监听 自动编译成js文件
// console.log('abc');
class Header{
constructor(){
const elem = document.createElement('div');
elem.innerText = "This is Header";
document.body.appendChild(elem)
}
}
class Content{
constructor(){
const elem = document.createElement('div');
elem.innerText = "This is Content";
document.body.appendChild(elem)
}
}
class Footer{
constructor(){
const elem = document.createElement('div');
elem.innerText = "This is Footer";
document.body.appendChild(elem)
}
}
class Page{
constructor(){
new Header()
new Content()
new Footer()
}
}
太多全局变量了 只需要 暴露Page
引入namespace:
// console.log('abc');
namespace Home {
class Header{
constructor(){
const elem = document.createElement('div');
elem.innerText = "This is Header";
document.body.appendChild(elem)
}
}
class Content{
constructor(){
const elem = document.createElement('div');
elem.innerText = "This is Content";
document.body.appendChild(elem)
}
}
class Footer{
constructor(){
const elem = document.createElement('div');
elem.innerText = "This is Footer";
document.body.appendChild(elem)
}
}
export class Page{
constructor(){
new Header()
new Content()
new Footer()
}
}
}
编译后的js文件:
"use strict";
// console.log('abc');
var Home;
(function (Home) {
class Header {
constructor() {
const elem = document.createElement('div');
elem.innerText = "This is Header";
document.body.appendChild(elem);
}
}
class Content {
constructor() {
const elem = document.createElement('div');
elem.innerText = "This is Content";
document.body.appendChild(elem);
}
}
class Footer {
constructor() {
const elem = document.createElement('div');
elem.innerText = "This is Footer";
document.body.appendChild(elem);
}
}
class Page {
constructor() {
new Header();
new Content();
new Footer();
}
}
Home.Page = Page;
})(Home || (Home = {}));
只有Page是全局变量了
header Content footer跟 Page 写在一起了 现在需要分开写:
把header Content footer 写在components.ts中:
namespace Components {
export class Header {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Header";
document.body.appendChild(elem);
}
}
export class Content {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Content";
document.body.appendChild(elem);
}
}
export class Footer {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Footer";
document.body.appendChild(elem);
}
}
}
page.ts
// console.log('abc');
namespace Home {
export class Page{
constructor(){
new Components.Header()
new Components.Content()
new Components.Footer()
}
}
}
但是 我们只想打包在一个文件 怎么办?
开启 outFile:指定一个将所有输出捆绑到一个JavaScript文件中的文件。
把dist 目录删除
编译后的js:
"use strict";
var Components;
(function (Components) {
class Header {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Header";
document.body.appendChild(elem);
}
}
Components.Header = Header;
class Content {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Content";
document.body.appendChild(elem);
}
}
Components.Content = Content;
class Footer {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Footer";
document.body.appendChild(elem);
}
}
Components.Footer = Footer;
})(Components || (Components = {}));
// console.log('abc');
var Home;
(function (Home) {
class Page {
constructor() {
new Components.Header();
new Components.Content();
new Components.Footer();
}
}
Home.Page = Page;
})(Home || (Home = {}));
合并在一起了
//Components与page 相互引用的声明 ///
/// <reference path='./components.ts'/>
命名空间还可以定义其他的类型
也是可以定义子的namespace
import 模块化引入
page.ts
import {Header ,Content ,Footer} from './components'
export default class Page {
constructor() {
new Header();
new Content();
new Footer();
}
}
components.ts
export class Header {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Header";
document.body.appendChild(elem);
}
}
export class Content {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Content";
document.body.appendChild(elem);
}
}
export class Footer {
constructor() {
const elem = document.createElement("div");
elem.innerText = "This is Footer";
document.body.appendChild(elem);
}
}
amd 模块 浏览器是不支持的 需要用到require.js
require.js地址 :www.bootcdn.cn/require.js/
require(['page'],function(page){
new page.default()
})
parcel
github: github.com/parcel-bund… 中文文档: www.parceljs.cn/getting_sta…
安装:
npm install -D parcel-bundler
目录结构:
npm run test