/** * CHANGELOG * 1. SystemInfo * 2. TempFileResponse * 3. enterProfile * 4. ModalOptions.title => ModalOptions.title? * 5. ModalOptions.content => ModalOptions.content? * 6. PropValueType 支持 null * 7. BlockComment * 8. 各种 defineProp * 9. 各种 PropType * 10. filePicker * 11. enterChat * 12. chooseChat * 13. chooseContact * 14. offWindowResize * 15. downloadFile filePath * 16. exitMiniProgram * 17. saveFileAs */ declare type StringPropType< T extends string, WithDefault = true, > = WithDefault extends true ? { (): T | ''; } : { (): T; }; declare type ObjectPropType< T extends object | null, WithDefault = true, > = ObjectConstructor & (WithDefault extends true ? { (): T | null; } : { (): T; }); declare type NumberPropType< T extends number, WithDefault = true, > = WithDefault extends true ? { (): T | 0; } : { (): T; }; declare type BooleanPropType< T extends boolean, WithDefault = true, > = WithDefault extends true ? { (): T | false; } : { (): T; }; declare type ArrayPropType< T extends Array, WithDefault = true, > = WithDefault extends true ? { (): T; } : { (): T; }; declare type NullPropType = WithDefault extends true ? { (): T | null; } : { (): T; }; declare function defineStringProp(options?: { value?: never; }): { type: StringPropType; }; declare function defineStringProp(options: { value: T; }): { type: StringPropType; value: T; }; declare function defineNumberProp(options?: { value?: never; }): { type: NumberPropType; }; declare function defineNumberProp(options: { value: T; }): { type: NumberPropType; value: T; }; declare function defineBooleanProp(options?: { value?: never; observer?: string; }): { type: BooleanPropType; observer?: string; }; declare function defineBooleanProp(options: { value: T; observer?: string; }): { type: BooleanPropType; value: T; observer?: string; }; declare function defineObjectProp(options?: { value?: never; }): { type: ObjectPropType; }; declare function defineObjectProp(options: { value: T; }): { type: ObjectPropType; value: T; }; declare function defineArrayProp(options?: { value?: never; observer?: string; }): { type: ArrayPropType; observer?: string; }; declare function defineArrayProp(options: { value: T; observer?: string; }): { type: ArrayPropType; value: T; observer?: string; }; declare function defineNullProp(options?: { value?: never; observer?: string; }): { type: NullPropType; observer?: string; }; declare function defineNullProp(options: { value: T; observer?: string }): { type: NullPropType; value: T; observer?: string; }; declare namespace BlockComment { type CreateCommentManagerOptions = { token: string; permission?: { resolve: boolean; delete: boolean; }; }; type CommentInfo = { bid: string; quote?: string; order?: number; type?: 'file' | 'image' | 'table'; }; type BizParams = Record; type MetaData = { commentId: string; bizParams?: BizParams; }; type Comment = { position: string; commentId: string; createTime: number; } & ( | { commentList: Record[]; } | { replyList: Record[]; } ); type CommentManager = { onActiveCommentChange: ( callback: (params: { prevCommentId: string; nextCommentId: string; }) => void, ) => void; onAfterAddComment: ( callback: (params: { type: 'completed' | 'reply' | 'canceled'; comment: { commentId: string; [k: string]: unknown; }; }) => void, ) => void; addComment: (params: { quote: string; position: string; bizParams: BizParams; }) => void; activateComment: (params: { commentId?: string; replyId?: string }) => void; setCommentMetadata: (params: MetaData[]) => void; onReady: (callback: () => void) => void; onCommentChange: (callback: (params: Comment[]) => void) => void; onAfterEditComment: (callback: (params: any) => void) => void; destroy: () => void; onError: ( callback: (params: { service: string; msg: string; code: string; }) => void, ) => void; }; } declare namespace tt { /** tt 额外类型 start */ type TtApiCallback< SuccessRes = { errMsg: string; }, FailRes = { errMsg: string; }, > = { success?: (res: SuccessRes) => void; fail?: (res: FailRes) => void; }; function exitMiniProgram(opt?: TtApiCallback): void; interface SystemInfo { gadgetVersion: string; navigationBarSafeArea: { width: number; height: number; right: number; bottom: number; }; safeArea?: { left: number; right: number; top: number; bottom: number; width: number; height: number; }; } function onWindowResize( /** 窗口尺寸变化事件的回调函数 */ callback: (result: { size: { /** 变化后的窗口高度,单位 px */ windowHeight: number; /** 变化后的窗口宽度,单位 px */ windowWidth: number; }; }) => void, ): void; function offWindowResize(callback: Function): void; function getLaunchOptionsSync(): { scene: number | string; [key: string]: unknown; }; function filePicker(options: { maxNum?: number; isSystem?: boolean; pickerTitle?: string; pickerConfirm?: string; fail?(res: { errMsg: `filePicker:fail`; errCode: number }): void; success( res: ErrMsgResponse & { list: { path: string; name: string; size: number; }[]; }, ): void; complete?(): void; }): void; interface TempFileResponse { statusCode: number; } function enterProfile( obj: { openid: string | number; left?: number; top?: number; } & TtApiCallback, ): void; type EnterProfileOptions = { openid: string | number; left?: number; top?: number; } & TtApiCallback; function openSchema( opt: { schema: string; external?: boolean; } & TtApiCallback, ): void; function createCommentManager( options: BlockComment.CreateCommentManagerOptions, ): BlockComment.CommentManager; interface ErrMsgResponse { /** 成功:ok,错误:详细信息 */ errMsg: 'ok' | string; } interface ChooseChatOptions extends BaseOptions { allowCreateGroup?: boolean; multiSelect?: boolean; ignoreBot?: boolean; selectType?: 0 | 1 | 2; confirmTitle?: string; confirmDesc?: string; externalChat?: boolean; showMessageInput?: boolean; } type i18nNames = { en_us: string; ja_jp: string; zh_cn: string; }; type ChooseChatRes = { errMsg: string; data: { id: string; chatType: 0 | 1; userType: 0 | 1; avatarUrls: string[]; name: string; i18nNames: i18nNames; }[]; message?: string; }; interface ChooseContactOptions extends BaseOptions< { errMsg: string; data: { avatarUrls: string[]; i18nNames: i18nNames; name: string; openId: string; }[]; }, string > { multi?: boolean; ignore?: boolean; chosenIds?: string[]; disableChosenIds?: string[]; limitTips?: string; enableChooseDepartment?: boolean; externalContact?: boolean; } interface EnterChatOptions extends BaseOptions { openid?: string; openChatId?: string; needBadge?: boolean; } function chooseChat(opt: ChooseChatOptions): void; function chooseContact(opt: ChooseContactOptions): void; function enterChat(opt: EnterChatOptions): void; /** tt 额外类型 end */ interface DataResponse { /** 回调函数返回的内容 */ data: object | string | ArrayBuffer; /** 开发者服务器返回的 HTTP 状态码 */ statusCode: number; /** 开发者服务器返回的 HTTP Response Header */ header: object; } interface ErrMsgResponse { /** 成功:ok,错误:详细信息 */ errMsg: 'ok' | string; } interface TempFileResponse { /** 文件的临时路径 */ tempFilePath: string; } interface BaseOptions { /** 接口调用成功的回调函数 */ success?(res: R): void; /** 接口调用失败的回调函数 */ fail?(res: E): void; /** 接口调用结束的回调函数(调用成功、失败都会执行) */ complete?(res: any): void; } interface ErrCodeResponse { errCode: number; } interface RequestHeader { [key: string]: string; } interface RequestOptions extends BaseOptions { /** 开发者服务器接口地址 */ url: string; /** 请求的参数 */ data?: string | object | ArrayBuffer | undefined; /** 设置请求的 header , header 中不能设置 Referer */ header?: RequestHeader | undefined; /** 默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */ method?: | 'GET' | 'OPTIONS' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'TRACE' | 'CONNECT' | undefined; /** 如果设为json,会尝试对返回的数据做一次 JSON.parse */ dataType?: string | undefined; /** * 设置响应的数据类型。合法值:text、arraybuffer * @version 1.7.0 */ responseType?: string | undefined; /** 收到开发者服务成功返回的回调函数,res = {data: '开发者服务器返回的内容'} */ success?(res: DataResponse): void; } /** * tt.request发起的是https请求。一个微信小程序,同时只能有5个网络请求连接。 */ function request(options: RequestOptions): RequestTask; /** * 返回一个 requestTask 对象,通过 requestTask,可中断请求任务。 */ interface RequestTask { abort(): void; } interface UploadTask { /** * 监听上传进度变化 * @version 1.4.0 */ onProgressUpdate( callback?: (res: { /** 上传进度百分比 */ progress: number; /** 已经上传的数据长度,单位 Bytes */ totalBytesSent: number; /** 预期需要上传的数据总长度,单位 Bytes */ totalBytesExpectedToSend: number; }) => void, ): void; /** * 中断下载任务 * @version 1.4.0 */ abort(): void; } interface UploadFileOptions extends BaseOptions { /** 开发者服务器 url */ url: string; /** 要上传文件资源的路径 */ filePath: string; /** 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容 */ name: string; /** HTTP 请求 Header , header 中不能设置 Referer */ header?: RequestHeader | undefined; /** HTTP 请求中其他额外的 form data */ formData?: any; } interface UploadFileResponse { data: string; statusCode: number; } /** * 将本地资源上传到开发者服务器。 * 如页面通过 tt.chooseImage 等接口获取到一个本地资源的临时文件路径后, * 可通过此接口将本地资源上传到指定服务器。 * 客户端发起一个 HTTPS POST 请求, * 其中 Content-Type 为 multipart/form-data 。 */ function uploadFile(options: UploadFileOptions): UploadTask; interface DownloadTask { /** * 监听下载进度变化 * @version 1.4.0 */ onProgressUpdate( callback?: (res: { /** 下载进度百分比 */ progress: number; /** 已经下载的数据长度,单位 Bytes */ totalBytesWritten: number; /** 预期需要下载的数据总长度,单位 Bytes */ totalBytesExpectedToWrite: number; }) => void, ): void; /** * 中断下载任务 * @version 1.4.0 */ abort(): void; } interface DownloadFileOptions extends BaseOptions { /** 下载资源的 url */ url: string; /** 下载资源的类型,用于客户端识别处理,有效值:image/audio/video */ type?: string | undefined; /** HTTP 请求 Header */ header?: RequestHeader | undefined; /** * 下载文件路径。格式为 ttfile://temp/feishu.png,其中 ttfile://temp/为固定格式,feishu.png 为文件名 * ttfile://temp/ 为临时文件目录,每次小程序冷启动会清空。默认下载目录为 ttfile://temp/ * 示例值:ttfile://temp/feishu.png */ filePath?: string; /** 下载成功后以 tempFilePath 的形式传给页面,res = {tempFilePath: '文件的临时路径'} */ success?(res: TempFileResponse): void; } /** * 下载文件资源到本地。客户端直接发起一个 HTTP GET 请求, * 把下载到的资源根据 type 进行处理,并返回文件的本地临时路径。 */ function downloadFile(options: DownloadFileOptions): DownloadTask; interface ConnectSocketOptions extends BaseOptions { /** 开发者服务器接口地址,必须是 HTTPS 协议,且域名必须是后台配置的合法域名 */ url: string; /** 请求的数据 */ data?: any; /** HTTP Header , header 中不能设置 Referer */ header?: RequestHeader | undefined; /** 默认是GET,有效值为: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */ method?: string | undefined; /** * 子协议数组 * @version 1.4.0 */ protocols?: string[] | undefined; } /** * 创建一个 WebSocket 连接; * 一个微信小程序同时只能有一个 WebSocket 连接, * 如果当前已存在一个 WebSocket 连接, * 会自动关闭该连接,并重新创建一个 WebSocket 连接。 */ function connectSocket(options: ConnectSocketOptions): void; /** 监听WebSocket连接打开事件。 */ function onSocketOpen(callback: () => void): void; /** 监听WebSocket错误。 */ function onSocketError(callback: (error: any) => void): void; interface SendSocketMessageOptions extends BaseOptions { /** 需要发送的内容 */ data: string | ArrayBuffer; } /** * 通过 WebSocket 连接发送数据,需要先 tt.connectSocket, * 并在 tt.onSocketOpen 回调之后才能发送。 */ function sendSocketMessage(options: SendSocketMessageOptions): void; /** * 监听WebSocket接受到服务器的消息事件。 */ function onSocketMessage(callback: (res: DataResponse) => void): void; /** * 关闭WebSocket连接。 */ interface CloseSocketOptions extends BaseOptions { code?: number | undefined; reason?: string | undefined; } /** * 关闭WebSocket连接。 */ function closeSocket(options: CloseSocketOptions): void; /** 监听WebSocket关闭。 */ function onSocketClose(callback: () => void): void; type ImageSizeType = 'original' | 'compressed'; type ImageSourceType = 'album' | 'camera'; type VideoSourceType = 'album' | 'camera'; type CameraDevice = 'front' | 'back'; interface TempFile { /** 本地文件路径 */ path: string; /** 本地文件大小,单位:B */ size: number; } interface TempFilesData { /** 文件的临时路径 */ tempFilePaths: string[]; /** * 图片的本地文件列表,每一项是一个 File 对象 * @version 1.2.0 */ tempFiles: TempFile[]; } interface ChooseImageOptions extends BaseOptions { /** 最多可以选择的图片张数,默认9 */ count?: number | undefined; /** original 原图,compressed 压缩图,默认二者都有 */ sizeType?: ImageSizeType[] | undefined; /** album 从相册选图,camera 使用相机,默认二者都有 */ sourceType?: ImageSourceType[] | undefined; /** 成功则返回图片的本地文件路径列表 tempFilePaths */ success(res: TempFilesData): void; } /** * 从本地相册选择图片或使用相机拍照。 */ function chooseImage(options: ChooseImageOptions): void; interface PreviewImageOptions extends BaseOptions { /** 当前显示图片的链接,不填则默认为 urls 的第一张 */ current?: string | undefined; /** 需要预览的图片链接列表 */ urls: string[]; } /** * 预览图片。 */ function previewImage(options: PreviewImageOptions): void; interface GetImageInfoOptions extends BaseOptions { /** * 图片的路径,可以是相对路径,临时文件路径,存储文件路径,网络图片路径 */ src: string; } /** * 获取图片信息 */ function getImageInfo(options: GetImageInfoOptions): void; interface SaveImageToPhotosAlbumOptions extends BaseOptions { /** * 图片的路径,可以是相对路径,临时文件路径,存储文件路径,网络图片路径 */ filePath: string; success(res: { errMsg: string }): void; } /** * 保存图片到系统相册。 * 需要用户授权 scope.writePhotosAlbum * @version 1.2.0 */ function saveImageToPhotosAlbum(options: SaveImageToPhotosAlbumOptions): void; interface compressImageOptions extends BaseOptions { /** * 图片的路径,可以是相对路径,临时文件路径,存储文件路径,网络图片路径 */ src: string; quality?: number | undefined; success(tempFilePath: string): void; } /** * 压缩图片接口,可选压缩质量 * @version 2.4.0 */ function compressImage(options: compressImageOptions): void; interface StartRecordAudioOptions extends BaseOptions { /** 录音成功后调用,返回录音文件的临时文件路径,res = {tempFilePath: '录音文件的临时路径'} */ success?(res: TempFileResponse): void; } /** * 开始录音。当主动调用tt.stopRecord, * 或者录音超过1分钟时自动结束录音,返回录音文件的临时文件路径。 * 注:文件的临时路径,在小程序本次启动期间可以正常使用, * 如需持久保存,需在主动调用tt.saveFile,在小程序下次启动时才能访问得到。 * @deprecated 1.6.0 */ function startRecord(options: StartRecordAudioOptions): void; interface StopRecordAudioOptions extends BaseOptions { success?(res: TempFileResponse): void; } /** * 主动调用停止录音。 */ function stopRecord(options?: StopRecordAudioOptions): void; type EncodeBitRate = | 8000 | 11025 | 12000 | 16000 | 22050 | 24000 | 32000 | 44100 | 48000; interface RecorderManagerStartOptions { /** * 指定录音的时长,单位 ms * 如果传入了合法的 duration * 在到达指定的 duration 后会自动停止录音,最大值 600000(10 分钟),默认值 60000(1 分钟) */ duration?: number | undefined; /** * 采样率,有效值 8000/16000/44100 */ sampleRate?: number | undefined; /** * 否 录音通道数,有效值 1/2 */ numberOfChannels?: number | undefined; /** * 编码码率 * 采样率和码率有一定要求,具体有效值如下: * 采样率 编码码率 * + 8000 16000 ~ 48000 * + 11025 16000 ~ 48000 * + 12000 24000 ~ 64000 * + 16000 24000 ~ 96000 * + 22050 32000 ~ 128000 * + 24000 32000 ~ 128000 * + 32000 48000 ~ 192000 * + 44100 64000 ~ 320000 * + 48000 64000 ~ 320000 */ encodeBitRate: number; /** 音频格式,有效值 aac/mp3 */ format: string; /** * 指定帧大小,单位 KB * 传入 frameSize 后,每录制指定帧大小的内容后 * 会回调录制的文件内容,不指定则不会回调。暂仅支持 mp3 格式。 */ frameSize: number; } interface OnRecorderManagerStopOptions { tempFilePath: string; } interface OnFrameRecordedOptions { /** 录音分片结果数据 */ frameBuffer: ArrayBuffer; /** 当前帧是否正常录音结束前的最后一帧 */ isLastFrame: boolean; } interface RecorderManager { /** 开始录音 */ start(options?: RecorderManagerStartOptions): void; /** 暂停录音 */ pause(): void; /** 继续录音 */ resume(): void; /** 停止录音 */ stop(): void; /** 录音开始事件 */ onStart(callback?: () => void): void; /** 录音暂停事件 */ onPause(callback?: () => void): void; /** 录音恢复事件 */ onResume(callback?: () => void): void; /** 录音停止事件,会回调文件地址 */ onStop(callback?: (options: OnRecorderManagerStopOptions) => void): void; /** 已录制完指定帧大小的文件,会回调录音分片结果数据。如果设置了 frameSize ,则会回调此事件 */ onFrameRecorded(callback?: (options: OnFrameRecordedOptions) => void): void; /** 录音错误事件, 会回调错误信息 */ onError(callback?: (err: ErrMsgResponse) => void): void; } /** * 获取全局唯一的录音管理器 recorderManager * @version 1.6.0 */ function getRecorderManager(): RecorderManager; interface PlayVoiceOptions extends BaseOptions { /** 需要播放的语音文件的文件路径 */ filePath: string; } /** * 开始播放语音,同时只允许一个语音文件正在播放, * 如果前一个语音文件还没播放完,将中断前一个语音播放。 * @deprecated 1.6.0 */ function playVoice(options: PlayVoiceOptions): void; /** * 暂停正在播放的语音。 * 再次调用tt.playVoice播放同一个文件时,会从暂停处开始播放。 * 如果想从头开始播放,需要先调用 tt.stopVoice。 * @deprecated 1.6.0 */ function pauseVoice(): void; /** * 结束播放语音。 * @deprecated 1.6.0 */ function stopVoice(): void; interface BackgroundAudioPlayerState { /** 选定音频的长度(单位:s),只有在当前有音乐播放时返回 */ duration: number; /** 选定音频的播放位置(单位:s),只有在当前有音乐播放时返回 */ currentPosition: number; /** 播放状态(2:没有音乐在播放,1:播放中,0:暂停中) */ status: number; /** 音频的下载进度(整数,80 代表 80%),只有在当前有音乐播放时返回 */ downloadPercent: number; /** 歌曲数据链接,只有在当前有音乐播放时返回 */ dataUrl: string; } interface GetBackgroundAudioPlayerStateOptions extends BaseOptions { /** 接口调用成功的回调函数 */ success?(state: BackgroundAudioPlayerState): void; /** 接口调用失败的回调函数 */ fail?(): void; /** 接口调用结束的回调函数(调用成功、失败都会执行) */ complete?(): void; } /** * 获取音乐播放状态。 * @deprecated 1.2.0 */ function getBackgroundAudioPlayerState( options: GetBackgroundAudioPlayerStateOptions, ): void; interface PlayBackgroundAudioOptions extends BaseOptions { /** 音乐链接 */ dataUrl: string; /** 音乐标题 */ title?: string | undefined; /** 封面URL */ coverImgUrl?: string | undefined; } /** * 播放音乐,同时只能有一首音乐正在播放。 * @deprecated 1.2.0 */ function playBackgroundAudio(options: PlayBackgroundAudioOptions): void; /** * 暂停播放音乐。 * @deprecated 1.2.0 */ function pauseBackgroundAudio(options?: PlayBackgroundAudioOptions): void; interface SeekBackgroundAudioOptions extends BaseOptions { /** 音乐位置,单位:秒 */ position: number; } /** * 控制音乐播放进度。 * @deprecated 1.2.0 */ function seekBackgroundAudio(options: SeekBackgroundAudioOptions): void; /** * 停止播放音乐。 * @deprecated 1.2.0 */ function stopBackgroundAudio(options?: PlayBackgroundAudioOptions): void; /** * 监听音乐播放。 * @deprecated 1.2.0 */ function onBackgroundAudioPlay(callback: () => void): void; /** * 监听音乐暂停。 * @deprecated 1.2.0 */ function onBackgroundAudioPause(callback: () => void): void; /** * 监听音乐停止。 * @deprecated 1.2.0 */ function onBackgroundAudioStop(callback: () => void): void; interface BackgroundAudioManager { /** 当前音频的长度(单位:s),只有在当前有合法的 src 时返回 */ readonly duration: number; /** 当前音频的播放位置(单位:s),只有在当前有合法的 src 时返回 */ readonly currentTime: number; /** 当前是是否暂停或停止状态,true 表示暂停或停止,false 表示正在播放 */ readonly paused: boolean; /** 音频的数据源,默认为空字符串,当设置了新的 src 时,会自动开始播放 ,目前支持的格式有 m4a, aac, mp3, wav */ src: string; /** 音频开始播放的位置(单位:s) */ startTime: number; /** 音频缓冲的时间点,仅保证当前播放时间点到此时间点内容已缓冲。 是 */ buffered: number; /** 音频标题,用于做原生音频播放器音频标题。原生音频播放器中的分享功能,分享出去的卡片标题,也将使用该值。 */ title: string; /** 专辑名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值 */ epname: string; /** 歌手名,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值 */ singer: string; /** 封面图url,用于做原生音频播放器背景图。原生音频播放器中的分享功能,分享出去的卡片配图及背景也将使用该图。 */ coverImgUrl: string; /** 页面链接,原生音频播放器中的分享功能,分享出去的卡片简介,也将使用该值 */ webUrl: string; /** 播放 */ play(): void; /** 暂停 */ pause(): void; /** 停止 */ stop(): void; /** 跳转到指定位置,单位 s */ seek(position: number): void; /** 背景音频进入可以播放状态,但不保证后面可以流畅播放 */ onCanplay(callback: (res: ErrCodeResponse) => void): void; /** 背景音频播放事件 */ onPlay(callback: (res: ErrCodeResponse) => void): void; /** 背景音频暂停事件 */ onPause(callback: (res: ErrCodeResponse) => void): void; /** 背景音频停止事件 */ onStop(callback: (res: ErrCodeResponse) => void): void; /** 背景音频自然播放结束事件 */ onEnded(callback: (res: ErrCodeResponse) => void): void; /** 背景音频播放进度更新事件 */ onTimeUpdate(callback: (res: ErrCodeResponse) => void): void; /** 用户在系统音乐播放面板点击上一曲事件(iOS only) */ onPrev(callback: (res: ErrCodeResponse) => void): void; /** 用户在系统音乐播放面板点击下一曲事件(iOS only) */ onNext(callback: (res: ErrCodeResponse) => void): void; /** 背景音频播放错误事件 */ onError(callback: (res: ErrCodeResponse) => void): void; /** 音频加载中事件,当音频因为数据不足,需要停下来加载时会触发 */ onWaiting(callback: (res: ErrCodeResponse) => void): void; } /** * 获取全局唯一的背景音频管理器 backgroundAudioManager。 * @version 1.2.0 */ function getBackgroundAudioManager(): BackgroundAudioManager; /** * audioContext 通过 audioId 跟一个