精华内容
下载资源
问答
  • Command.TS重写 command.ts리라이트다버전입니
  • 现在的前端真的看不懂啊,还有重学ES6 TypeScript , 还要安nodejs npm 编译 vue-next 状态:测试版。 1.所有计划中的RFC已合并。 2.... 3.Vue CLI现在通过vue-cli-plugin-vue-next提供了实验性支持。...

    现在的前端真的看不懂啊,还有重学ES6 TypeScript , 还要安nodejs npm 编译

    vue-next 状态:测试版。

    1.所有计划中的RFC已合并。
    2.所有合并的RFC已实现。
    3.Vue CLI现在通过vue-cli-plugin-vue-next提供了实验性支持。

    这里还有一个简单的基于webpack的简单安装程序,支持“单文件组件”。
    请注意,与2.x仍然可能存在未记录的行为不一致。
    遇到这种情况时,请确保首先检查现有RFC是否已经提出了行为差异。
    如果不一致不是RFC的一部分,则很可能是意料之外的,应该打开一个问题(打开新问题时请确保使用问题助手)。
    此外,当前的实现在运行时环境中需要本机ES2015 +,并且不支持IE11(尚未)。达到RC阶段后,将可以处理IE11兼容版本

     

    展开全文
  • luogu冬日画板自动绘图脚本,使用TS重写了去年的脚本,支持多用户,维护
  • vue3.0+vite+ts 重写手机端upload组件

    千次阅读 多人点赞 2020-09-03 08:26:12
    重新运行yarn install 编写代码 Vue3.0-ts-upload **uploader组件 ** 不足之处 / 一些想法 props传参时,是否应使用如下代码: interface IProps{ title:string, limit:number, ... } props:[title,limit], setup...

    前言

    nice to meet you~ 认识一下

    大家好~ 很高兴在这里写下了自己的第一篇文章。

    github地址

    里面有关于这个组件的完整代码,还有一些todo、发布订阅、观察者等相关代码。

    移动端上传通用组件

    编写目的

    • 记录vue3.0尝鲜的开发过程

    • 一边体验Compositon API一边学习typescript

    关注组件

    通常开发一个组件,我们需要问自己两个问题:

    1、这个组件是解决什么问题?

    2、组件颗粒化需要达到什么程度?

    回答如下:

    1、提高复用性、提升开发效率、解耦等等。

    2、像上传组件,我们需要考虑自身项目及业务了,这里我这边的需求比较简单,大概是满足上传->预览/删除->数据回调即可。

    满足以下需求:

        - [x] 调用手机相机、相册
    
        - [x] 获取图片并渲染到浏览器
    
        - [x] 解决图片EXIF旋转
    
        - [x] 预览图片
    
        - [x] 删除图片
    
        - [x] 支持上传图片配置
    
        - [x] 支持多选
    
        回调方法:
    
        @on-change="onChange"
    
        @on-success="onSuccess"
    
        @on-error="onError"
    
    

    vue3.0、vite搭建

      $ yarn create vite-app <project-name>
    
      $ cd <project-name>
    
      $ yarn
    
      $ yarn dev
    
    

    集成 typescript

      $yarn add --dev typescript
    

    集成 sass

      $yarn add sass
    

    安装sass时,你会发现控制台报错,解决方法:

    1. 打开package.json

    2. 把dependencies里的sass这一行,移到devDependencies

    3. 重新运行yarn install

    编写代码

    <template>
      <div>
        <h1>Vue3.0-ts-upload</h1>
        <k-uploader
          :files="fileList"
          title="vue3.0_ts_组件上传"
          @on-change="onChange"
          @on-success="onSuccess"
          @on-error="onError"
        ></k-uploader>
      </div>
    </template>
    
    <script lang="ts">
    import { reactive, ref } from "vue";
    import KUploader from "../components/Uploader/Uploader.vue";
    
    // 附件对象接口
    interface IFile {
      url: string;
    }
    export default {
      components: {
        KUploader,
      },
      setup() {
        const activeId = ref<number | null>(null);
        // 默认附件数据
        const fileList = reactive<Array<IFile>>([
          {
            url: "https://ossweb-img.qq.com/images/lol/web201310/skin/big84000.jpg",
          },
          {
            url: "https://ossweb-img.qq.com/images/lol/web201310/skin/big37006.jpg",
          },
          {
            url: "https://ossweb-img.qq.com/images/lol/web201310/skin/big39000.jpg",
          },
        ]);
    
        const onSuccess = (res: IFile) => {
          console.log(res);
          console.log("success");
        };
        const onError = (res: IFile) => {
          console.log(res);
          console.log("error");
        };
        const onChange = (res: IFile[]) => {
          console.log(res);
          console.log("change");
        };
        return {
          fileList,
          activeId,
          onSuccess,
          onError,
          onChange,
        };
      },
    };
    </script>
    
    <style>
    </style>
    

    **uploader组件 **

    <script lang="ts">
    import { ref, reactive, watchEffect } from "vue";
    import { handleFile, transformCoordinate, dataURItoBlob } from "./utils";
    // 文件信息接口
    interface IFile {
      url: string;
    }
    interface IFileItem {
      url: string;
      blob: any;
    }
    // InputEvent接口
    interface HTMLInputEvent extends Event {
      target: HTMLInputElement & EventTarget;
    }
    export default {
      name: "Uploader",
      props: {
        title: {
          type: String,
          default: "图片上传",
        },
        files: {
          type: Array, //初始化数据源
          default: () => [],
        },
        limit: {
          type: Number, //限制上传图片个数
          default: 9,
        },
        capture: {
          type: Boolean, //是否只选择调用相机
          default: false,
        },
        enableCompress: {
          type: Boolean, //是否压缩
          default: true,
        },
        maxWidth: {
          type: Number, //图片压缩最大宽度
          default: 1024,
        },
        quality: {
          type: Number, //图片压缩率
          default: 0.9,
        },
        url: {
          type: String, //上传服务器url
          default: "",
        },
        params: {
          type: Object, //上传文件时携带的自定义参数
          default: () => {},
        },
        name: {
          type: String, //上传文件时FormData的Key,默认为file
          default: "file",
        },
        autoUpload: {
          type: Boolean, //是否自动开启上传
          default: true,
        },
        multiple: {
          type: Boolean, //是否支持多选, `false`为不支持
          default: "",
        },
        readonly: {
          type: Boolean, //只读模式(隐藏添加和删除按钮)
          default: false,
        },
      },
      setup(props, { emit }) {
        // 待上传文件
        let fileList = reactive<any[]>(props.files);
        //fileList = files;
        // 预览开关
        let previewVisible = ref<Boolean>(false);
        // 当前预览的图片序号
        let currentIndex = ref(0);
        // 定义当前预览图片img
        let currentImg = ref<string | null>("");
        let inputValue = ref<string | null>("");
    
        watchEffect(()=>{
          
        })
    
    
        // 文件变更操作
        const handleChange = (event: HTMLInputEvent): void => {
          const { enableCompress, maxWidth, quality, autoUpload } = props;
          const target = event.target || event.srcElement;
          const inputChangeFiles: [] | any = target.files;
          // console.log("files", inputChangeFiles);
          if (inputChangeFiles.length <= 0) {
            // 调用取消
            return;
          }
          const fileCount = fileList.length + inputChangeFiles.length;
          if (fileCount > props.limit) {
            alert(`不能上传超过${props.limit}张图片`);
            return;
          }
          // console.log("handleFile");
          // 执行操作
          Promise.all(
            Array.prototype.map.call(inputChangeFiles, (file) => {
              return handleFile(file, {
                maxWidth,
                quality,
                enableCompress,
              }).then((blob) => {
                const blobURL = URL.createObjectURL(blob);
                const fileItem: any = <IFileItem>{
                  url: blobURL,
                  blob,
                };
                for (let key in file) {
                  if (["slice", "webkitRelativePath"].indexOf(key) === -1) {
                    fileItem[key] = file[key];
                  }
                }
                if (autoUpload) {
                  uploadFile(blob, fileItem)
                    .then((result) => {
                      fileList.push(fileItem);
                      // 回调方法
                      // vue2.x写法 :this.$emit('on-change', fileList);
                      emit("on-change", fileList);
                      console.log("success");
                    })
                    .catch((e) => {
                      fileList.push(fileItem);
                    });
                } else {
                }
              });
            })
          ).then(() => {
            inputValue.value = "";
          });
        };
    
        // 上传文件
        const uploadFile = (blob: string, fileItem: any) => {
          return new Promise((resolve, reject) => {
            // 暂时resolve 模拟返回 正式使用请删掉
            const result = {
              status: 1,
              msg: "上传成功",
              data: {
                filename: "图片名字",
                url:
                  "https://ossweb-img.qq.com/images/lol/web201310/skin/big84000.jpg",
              },
            };
            resolve(result);
            emit("on-success", result);
            return;
    
            const me = this;
            const { url, params, name } = props;
            const formData = new FormData();
            const xhr = new XMLHttpRequest();
    
            formData.append(name, blob);
            if (params) {
              for (let key in params) {
                formData.append(key, params[key]);
              }
            }
            xhr.onreadystatechange = () => {
              if (xhr.readyState === 1) {
                if (localStorage.getItem("token")) {
                  const accessToken: any = localStorage.getItem("token");
                  xhr.setRequestHeader("Authorization", accessToken);
                }
              }
              if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                  const result = JSON.parse(xhr.responseText);
                  // 回调父页面on-success
                  // vue2.x写法 this.$emit("on-success", result, fileItem);
                  emit("on-success", result, fileItem);
                  resolve(result);
                } else {
                  // 回调父页面on-error
                  // vue2.x写法 this.$emit("on-error", xhr);
                  emit("on-error", xhr);
                  reject(xhr);
                }
              }
            };
            xhr.upload.addEventListener(
              "progress",
              function (evt) {
                if (evt.lengthComputable) {
                  const precent = Math.ceil((evt.loaded / evt.total) * 100);
                  // 上传进度
                }
              },
              false
            );
            xhr.open("POST", url, true);
            xhr.send(formData);
          });
        };
    
        // 预览图片、删除图片
        const handleFileClick = (
          e: MouseEvent,
          item: IFile,
          index: number
        ): void => {
          showPreviewer();
          currentImg.value = item.url;
          currentIndex.value = index;
        };
    
        // 显示预览
        const showPreviewer = () => {
          previewVisible.value = true;
        };
    
        // 隐藏预览
        const handleHide = () => {
          previewVisible.value = false;
        };
    
        // 删除图片
        const handleDelete = () => {
          const delFn = () => {
            handleHide();
            fileList.splice(currentIndex.value, 1);
            emit("on-change", fileList);
          };
          delFn();
        };
    
        return {
          fileList,
          previewVisible,
          currentImg,
          inputValue,
          handleChange,
          handleFileClick,
          handleHide,
          handleDelete,
        };
      },
    };
    </script>
    

    不足之处 / 一些想法

    • props传参时,是否应使用如下代码:
    interface IProps{
            title:string,
            limit:number,
            ...
    }
    props:[title,limit],
    setup(props:IProps,context){
    }
    
    将 props 独立出来作为第一个参数,可以让 TypeScript 对 props 单独做类型推导,不会和上下文中的其他属性相混淆。这也使得 setup 、 render 和其他使用了 TSX 的函数式组件的签名保持一致。
    
    • composition api 提倡的是代码提取和重用逻辑,但我个人觉得我还没做到这点,以后要加强。

    写在最后

    • 感谢能花费自己宝贵的时间看完这篇文章的读者们。

    • 希望能一起在代码这条路上努力~

    最后别忘了点赞噢 谢谢~

    展开全文
  • // 抽象类和重写重载继承多态 export {} // 抽象类.抽象方法不包括具体实现, 必须在子类里面实现; 抽象方法必须写在抽象类里面 abstract class Animal { //抽象类 name: string abstract speak():void //抽象...
    // 抽象类和重写重载继承多态
    
    export {}
    
    // 抽象类.抽象方法不包括具体实现, 必须在子类里面实现; 抽象方法必须写在抽象类里面
    abstract class Animal {  //抽象类
      name: string
      abstract speak():void  //抽象方法
    }
    
    class Cat extends Animal {
      speak(): void {             //重写父类的方法speak
        console.log('喵喵喵');
      }
    }
    
    
    
    //重写: 子类重写继承自父类的方法
    //重载: 函数的重载
    function double(val:string)
    function double(val:number)
    function double(val:any){
      if(typeof val === 'number') {
        return val*2
      } else if(typeof val === "string") {
        return val + val
      }
    }
    double(2)
    double('1')
    // double(true)  //加上上面两句之后这里如果传布尔值就会报错, 也即函数的重载
    
    
    
    // 继承和多态
    // 继承: 主要是通过extends
    // 多态: 同一个方法,不同的子类有不同的实现, 如父类的speak方法,子类Cat的实现如上, 而其他子类的实现如下:
    
    class Dog extends Animal {
      speak(): void {             //重写父类的方法speak
        console.log('汪汪汪');
      }
    }
    
    展开全文
  • 类的继承 在使用TypeScript这门语言时,一个最重要基本功就是面向对象编程,那对类的扩展就变的格外重要,扩展经常使用的手段就是继承。 继承:允许我们创建一个类(子类),从已有的类(父类)上继承所有的属性和...

    类的继承

    在使用TypeScript这门语言时,一个最重要基本功就是面向对象编程,那对类的扩展就变的格外重要,扩展经常使用的手段就是继承。

    继承:允许我们创建一个类(子类),从已有的类(父类)上继承所有的属性和方法,子类可以新建父类中没有的属性和方法。

    class Mags{
        public name:string
        public age:number
        public skill:string
        constructor(name:string,age:number,skill:string){
            this.name = name
            this.age = age
            this.skill = skill
        }
        public interest(){
            console.log("找小姐姐")
        }
    }
    
    
    let mans:Mags = new Mags("大山",12,"coding")        //实例化自己
    
    mans.interest()                   //调用展示公共兴趣     输出‘找小姐姐’
    
    
    class JsMa extends Mags{               //关键字  extends    ,以及驼峰命名
        public xingxiang:string = "帅气"
    
    
        public interest(){
            super.interest()
            console.log("建立找妹平台!")
        }
        public money(){                                   //子类新技能
            console.log("赚一个亿")
        }
    
    }
    let shuai = new JsMa('小三',2,'金融')
    shuai.interest()             //输出‘找小姐姐,建立找妹平台!’
    shuai.money()
    

    我作了一个我自己的抽象类,有姓名,有年龄,有技能,然后还有一个函数是兴趣。类创建好之后我们就进行了实例化。

    extends关键字就是继承的重点

    ypeScript不支持多重继承。

    JsMa 是我声明的孩子,先是继承了父类的方法,然后通过super关键字调用了父类的方法,实现了技能的增加。

    展开全文
  • typescript继承和重写

    万次阅读 2018-12-18 11:59:43
    类的继承和重写 在这里通过一个例子,说一下typescript继承和重写 //父类 class Gege{ public name:string; public age:number; public sex:string; public constructor(sex:string,name:string,age:number){ ...
  • Typescript重写构造函数

    2021-04-10 16:51:30
    Typescript中,添加了一个Sysuser类,想自定义一个构造函数,传入一个字符串做参数,一开始写法如下: ... Sysuser(jsonStr:string){ //重写构造函数 let obj = JSON.parse(jsonStr); this.id =
  • TypeScript中重载跟重写的详解及区别

    千次阅读 2020-01-03 11:00:11
    方法重写(Override) 不在一个类中,参数类型保持一致,方法内容可以不同 一个子类除了可以继承父类的属性和方法外,还可以重新写父类的方法; 重写:保留父类的方法名,但是方法的实现内容或成员的返回值类型都被子类...
  • console.log("-----------------------使用原型实现继承---------------------------"); function Person() { } Person.prototype.dance = function () {}; function NinjaTestInherit() {} ...
  • TS 学习 TS 声明-ts7

    千次阅读 2019-07-17 18:12:26
    // index.ts(1,1): error TS2304: Cannot find name ‘jQuery’. 这时,我们需要使用 declare 关键字来定义它的类型,帮助 TypeScript 判断我们传入的参数类型对不对: declare var jQuery: (selector: string) =...
  • ts-paths 对 tsc 命令做了一些扩展 tsconfig.json 中 paths 参数对文件路径做了映射,但是编译时并没有把路径替换,所以在此命令中做了处理 使用 yarn add --dev ts-paths npx ts-paths build ./ -t tsconfig.json -...
  • TS Vue 重写 APlayer HTML5 音乐播放器
  • 方法的重写(Override)

    千次阅读 2019-07-03 11:29:53
    1.什么时候需要用到重写? 答:父类的功能无法满足子类的需求时,则需要用到重写; 2.重写有什么好处? 答:重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 3....
  • ts接口扩展、接口继承

    千次阅读 2019-06-08 19:38:30
    接口扩展:接口可以继承接口 interface Animal{ eat():void; } interface Person extends Animal{ work():void; } class Web implements Person{ name: string constructor(name:string){ ... ...
  • 接口中的方法重写

    2019-04-13 15:51:00
    接口中方法重写和类中方法重写满足的要求是一致的 方法签名由方法名称和参数列表(方法的参数的顺序和类型)组成 方法签名一样,代表的是同一个方法 1返回类型与被重写方法的返回类型可以不相同,但是必须是...
  • vue+ts 封装axios网络请求封装

    千次阅读 2020-11-02 22:48:48
    request.ts 文件 import axios from 'axios'; import router from '@/router'; import StatusInit from '@/utils/status/StatusInit' // 状态码的策略模式 const CancelToken: any = axios.CancelToken; // axios ...
  • 想用多态实现Laya(JavaScript开发,以下简称JS)游戏中的一些管理类,希望子类重写父类方法且又可以执行父类方法中的代码,由于不熟悉JS和ES6,所以写了试验代码摸索了一下,代码和结果如下: 1.父类: 2.子类: ...
  • 重写(Override) 从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,...
  • 这是TypeScript AST变形金刚,可让您相应地在输出JS& d.ts文件中重写导入路径。 这样做的主要用例是减轻不同的构建系统导入结构,例如相对import与绝对import以及别名化输出import路径。 用法 打字稿 ttypescript...
  • nodeJs错误处理 通过上面的学习,存在一个很大问题,就是我们把操作数据库的错误抛给了client这种实践是非常...src/exceptions/HttpException.ts class HttpException extends Error{ constructor(public status:n...
  • 重写equals方法

    2021-05-25 22:08:15
    如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写 equals()与hashCode()。 重写hashcode: public int hashCode() { int result; result =getName().hashCode(); result =29*result + ...
  • 考茨 改写TypeScript
  • /@Override public boolean equals(Object obj){ //当调用对象和参数指向同一个对象是,则内容一定相同 if (this == obj) return true; //当调用对象不为空而参数对象为空时,则内容一定不...Student ts = (Student) o
  • 使用Typescript重写axios

    2019-05-29 01:01:00
    使用typescript-library-starter脚手架创建项目ts-axios git clone https://github.com/alexjoverm/typescript-library-starter.git ts-axios cd ts-axios npm install npm run start // 打包命令 npm test // ...
  • 他的介绍的的fp-ts重写。 安装与设定 git clone cd spotify-fp-ts-example npm install 创建Spotify应用 由于Spotlight现在需要一个API令牌才能针对其“公共” API发出请求,因此您必须 。 拥有应用程序后,请...
  • 要是一直点,会一直弹出,影响体验。 element-ui中的message在实际使用过程中很多时候会遇到,相同的message会在短时间内同时出现在页面上,这种情况下是没有必要的。比如一个错误信息提示...我们可以通过重写elem.
  • // ./src/type/index.ts export interface AxiosInterceptorManager<T> { use(resolved: ResolvedFn<T>, rejected?: RejectedFn) : number eject(id: number): void } expor...
  • Java重写、覆盖、重载

    2020-04-30 16:27:54
    Java重写、覆盖、重载 首先说明一下,重写与覆盖是同一个概念,重写==覆盖。这里主要叙述一下重载,重写(覆盖)简单聊一下。 重写(覆盖) 重写一般来说就是将父类的方法重新实现。 下面展示一些 内联代码片。 ...
  • Ts_05类的标注

    2021-04-23 14:03:03
    Ts面向对象编程思想 类 类的概念 面向对象编程中一个重要的核心就是: 类 ,当我们使用面向对象的方式进行编程的时候,通常会首先 去分析具体要实现的功能,把特性相似的抽象成一个一个的类,然后通过这些类实例化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,689
精华内容 5,875
关键字:

ts重写