1.我们在用ts开发项目时,什么时候我们需要自己写(.)声明文件:
(1).文件是什么:可以这么说,它是js代码的声明文件,比如我们用js写了一个类,然后我们用这个类,但是js里的变量没有智能提示,但是ts的代码就会智能提示,这个时候,我们就给我们的js文件再写一个.结尾的文件,里面是对我们js文件里类的声明,这个时候,我们在访问这个类时,就会有智能提示了
.文件只是个声明文件,它不会被编译进你的代码里,发布代码的时候只会把你的原js代码编译进去
它就是在我们用ts项目中,用于在书写代码时,智能提示用的
(2)你在用ts开发项目时,你会发现,如果你用了框架,比如vue,jquery,creator等等,一般这些框架的原代码是放在libs这么个文件夹,里面就包含原代码的js文件和.文件,.文件就是js文件的声明,给我们写ts项目时,智能提示用的
(3)我们一般都不用自己书写.文件,我现在遇到的,就是我在接入第三方h5的sdk时,因为第三方给我的是一个js文件,没给我.文件,我在我的ts项目里如果直接写js里的变量名会出错,虽然ts中有方法让他不出错,比如我们要访问一个js里的变量,通过这杨访问,window['变量名'],这样ts就不会进行类型检查,就不会报错,但是最好的,就是我们写个声明文件,产生智能提示,让ts帮助我们写代码,也对项目维护好一点,别的同事接收项目也看的清楚一点
后面我觉得,第三方的sdk公司,就应该连同js和.给到我们,我觉得会往这方面发展的
2.我们怎么来写:
(1)首先我们新建文件,命名随便,以.结尾
(2)比如第三方库中有一个全局变量给我们使用,我们这么声明
declare var foo: number;
//var let const都可以
(3)全局函数
declare function greet(greeting: string): void;
(4)带属性的对象
declare namespace myLib {
function makeGreeting(s: string): string;
let numberOfGreetings: number;
}
(5)类
declare class Greeter {
constructor(greeting: string);
greeting: string;
showGreeting(): void;
}
(6)我们还可以在声明文件里写接口,比如我们收到第三方的某个数据,这个数据可以定义一个接口
interface AlertOptions {
modal: boolean;
title?: string;
color?: string;
}
一般第三方sdk都会有一个全局的变量,我们要使用的,都在这个变量下面,这个时候,我们只需用到第(4)种,带属性的对象,使用namespace,对于接口,我们可以写在namespace外面,也可以写在namespace里面,建议写在里面,这杨我们就通过namespace.接口名来访问接口,防止接口与我们自己项目中的接口冲突,因为这个接口写在这个命名空间下面
3.下面是我接quickH5sdk写的.声明文件:
/**quick h5 sdk */
declare namespace QuickSDK{
/**登录返回参数中data数据接口 */
interface LoginDataObjIF{
/**渠道uid */
uid:string;
/**渠道username */
username:string;
/**token 游戏服务器需通过v2/checkUserInfo接口(参见服务器接口文档)验证token和UID的正确性 */
token:string;
/**是否游客,登录后此值为true */
isLogin:boolean;
/**渠道ID */
channelId:string;
}
/**登录返回参数接口 */
interface LoginData{
/**是否登录成功,true成功,false失败 */
status:boolean;
data:LoginDataObjIF;
/**status为false时,此字段为Failed表示登录失败,为cancel表示玩家取消登录 */
message:string;
}
/**初始化 */
function init(productCode:string,productKey:string,b:boolean,func:Function):void;
/**登录 */
function login(func:(callbackData:LoginData)=>void):void;
/**一些渠道(如:百度 天宇游等)在悬浮框有切换账号的功能,此回调即切换成功后的回调。游戏应清除当前的游戏角色信息。在切换账号成功后回到选择服务器界面,用回调结果里面的新的UID 和Token 进入游戏。注意:在此回调内无需调用登录接口 */
function setSwitchAccountNotification(func:(callbackData:LoginData)=>void):void;
/**支付接口
** 注:选传的字段值可以为空,但是对象必须包含此属性.
*/
interface PayIF{
/**必传 QuickSDK后台自动分配的参数 */
productCode:string;
/**必传 渠道UID */
uid:string;
/**必传 渠道username */
username:string;
/**必传 游戏内角色ID */
userRoleId:string;
/**必传 游戏角色 */
userRoleName:string;
/**必传 角色所在区服ID */
serverId:number;
/**必传 角色所在区服 */
userServer:string;
/**必传 角色等级 */
userLevel:number;
/**必传 游戏内的订单,服务器通知中会回传 */
cpOrderNo:string;
/**必传 购买金额(元) */
amount:string;
/**必传 购买商品个数 */
count:number;
/**必传 购买商品单位,如,个 */
quantifier:string;
/**必传 道具名称 */
subject:string;
/**必传 道具描述 */
desc:string;
/**选传 服务器通知地址 */
callbackUrl:string;
/**选传 透传参数,服务器通知中原样回传 */
extrasParams:string;
/**必传 商品ID */
goodsId:string;
}
/**支付 */
function pay(orderInfoJson:string,func:(payStatusObject:any)=>void):void;
/**上传角色信息接口 */
interface Role{
isCreateRole:boolean;
roleCreateTime:string;
uid:string;
username:string;
serverId:number;
serverName:string;
userRoleId:string;
userRoleName:string;
userRoleBalance:number;
vipLevel:number;
userRoleLevel:number;
partyId:number;
partyName:string;
gameRoleGender:string;
gameRolePower:number;
partyRoleId:number;
partyRoleName:string;
professionId:string;
profession:string;
friendlist:string;
}
/**上传角色信息 */
function uploadGameRoleInfo(roleInfoJson:string,func:(response:any)=>void):void;
/**登出 */
function logout(func:(logoutObject:any)=>void):void;
/**设置登出成功监听器 */
function setLogoutNotification(func:(logoutObject:any)=>void):void;
}