typescript给第三方插件添加声明type,或者额外添加属性

添加 ts 声明

给无声明文件的插件添加

直接 import "web-storage-cache" 会显示 any,需要额外加多 type

declare module "web-storage-cache" {
  export default class WebStorageCache {
    /** wsCache.set('username', 'wqteam', {exp : 100}); 时间:秒 */
    set(name: string, value: any, option?: { exp: number }) {}
    get: any;
    delete: any;
    clear: any;
  }
}

给第三方插件额外添加

// 给element添加多两个组件声明
import * as element from "element-ui";

declare module "element-ui" {
  export const TreeTable: any;
  export const TreeTableColumn: any;
}

给第三方 interface 添加属性

例如:想给 antd-upload 的 props 添加多一个属性

import { UploadProps } from "antd/lib/upload";
declare module "antd/lib/upload" {
  export interface UploadProps {
    /** customRequest: async ({ file, onSuccess, onError } 回调 */
    onSuccess?: Func;
  }
}


给window添加属性

interface Window {
  socialShare: any;
}
// 或
declare global {
  interface Window {
    [key: string]: any;
  }
}

修改第三方插件属性

declare module 'taro-f2' {
  import * as React from 'react'
  export interface IProps {
    onCanvasInit: any
  }
  export class F2Canvas extends React.Component<IProps, any> {
    static fixF2(F2: any) {}
  }
}

import { ComponentType } from 'react';
import { VideoProps } from '@tarojs/components/types/Video';
declare module '@tarojs/components/types/Video' {
  export interface VideoProps {
    /** hbuilder页面内播放 */
    playsinline?: boolean;
  }
}

扩展函数

export namespace accountLogin {
  export interface Param {
    userName: string // 用户名
    password: string // 密码
    clientType: string // 客户端类型
    isRemember?: boolean //  是否记住
  }
  export interface PromiseData {
    loginSession: LoginSession
  }
}
export const accountLogin = (data:accountLogin.Param) : Promise<accountLogin.LoginSession>=>post(data)

扩展类

declare namespace Player {
  type ActionName = "move_up" | "move_down" | "move_left" | "move_right" | "run_up" | "run_down" | "run_left" | "run_right" | "";
}

class Player {
  public doActions(actionName: Player.ActionName) {
  }
}

react获取props

import * as React from 'react';
import { Button } from 'antd';
 
type ButtonProps = React.ComponentProps<typeof Button>;

自动根据string推断类型


type ShapeType = 'Square'| 'Circle'
interface Square {
    size: number;
}
interface Circle {
    radius: number;
}
type MutableRecord<U> = {
    [SubType in keyof U]: {
        type: SubType;
        data: U[SubType]
    };
}[keyof U];
type Shape = MutableRecord<{
    'Square': Square;
    'Circle': Circle;
}>;
const shape: Shape = {
    type: 'Circle',
    data: {
        radius: 10,
    }
};

其他功能

https://mp.weixin.qq.com/s/98T_14vcbZtFM5BfTCCzWA

// 公共类型
interface User {
  name: string;
  age: number;
  password: string;
}
type Role = "admin" | "user" | "guest";
type Role1 = "ADMIN" | "USER" | null;

// 转大小写
type UppercaseRole = Uppercase<Role>; 
type LowercaseRole = Lowercase<Role>; 
// 首字母大写
type CapitalizeRole = Capitalize<Role>;
type UncapitalizeRole = Uncapitalize<Role>;
// Exclude 属性排除
type NonAdmin = Exclude<Role, "admin"|"user">; // guest
// NonNullableRole 排除null和undefined
type NonNullableRole = NonNullable<Role1>; // "ADMIN" | "USER"

// Partial 全部改可选属性
type PartialUser = Partial<User>;
// 必填
type RequiredUser = Required<User>;
// 只读
type ReadonlyUser = Readonly<User>;
// Pick 挑选属性组合
type UserPartial = Pick<User, "name" | "age">;
// Omit 剔除某些属性
type UserPartialOmit = Omit<User, "password">;
// 构造一个对象类型Record, 比较少用
interface Address {
  street: string;
  pin: number;
}
type AddressesRecord = Record<"home" | "office", Address>;

// 获取某函数返回值类型
function funcA(){
 return '';
}
type someType = ReturnType<typeof funcA>;

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