ts代码规范问题[二]

判空
  • 当需要获取一个决不允许为空的游戏物体的时,不要在代码里通过名字或标签之类来获取,直接定义成属性在编辑器界面拖入.
  • 判断一个参数是否是自己想要的,不是就return;在这种情况下,return之前先输出警告,方便以后查找问题.
  • 当方法的参数为引用类型时,全部需要判断是否为空值并做相关处理.
  • 通过代码用游戏物体的名字或者其他方式获取游戏物体时,需要判断没有获取到的情况,也就是获取到空值的情况.
命名
  • 不要用now表示”当前”,用current.
  • 什么什么的总数就命名为total…number.
划分判断级别
    同级判断,就对同一种参数进行判断.不要同时掺杂多种类型.比如
/**
     * 图片滑动
     * @param scrollview scrollview
     * @param dirction 滑动方向
     * @param distance 滑动距离
     */
    private UpdateScrollviewHonorSpritesContainer( scrollview:cc.ScrollView , dirction:EnumSlideDirection , distance:number ) : void
    {
        if( scrollview == null )
        {
            cc.warn("DlgHonor.UpdateScrollviewHonorSpritesContainer:scrollview不能为空");
            return;
        }

        let totalSpriteNumberMax = scrollview.content.children.length - 1;
        let totalSpriteNumberMin = 0;
        let playAnimationTime = 0.2;
        let scrollEndPoint = cc.Vec2.ZERO;

        this.ChangeIsPlayingAnimation(playAnimationTime);

        if ( dirction == EnumSlideDirection.eDirection_Right )//向右滑动一张图片
        {
            if ( this.m_nCurrentSpriteIndex < totalSpriteNumberMax)
            {
                this.m_nCurrentSpriteIndex += 1;
            }
            scrollEndPoint = cc.p( this.m_nHonorSpriteWidth * this.m_nCurrentSpriteIndex, 0 );
        }
        else if ( dirction == EnumSlideDirection.eDirection_Left )//向左滑动一张图片
        {
            if ( this.m_nCurrentSpriteIndex > totalSpriteNumberMin )
            {
                this.m_nCurrentSpriteIndex -= 1;
            }
            scrollEndPoint = cc.p( this.m_nHonorSpriteWidth * this.m_nCurrentSpriteIndex , 0 );
        }
        else if ( distance != 0 )//根据距离滑动
        {
                playAnimationTime = 0;
                scrollEndPoint = cc.p( distance , 0 );
                playAnimationTime = 0;
        else//根据图片索引滑动
        {
                scrollEndPoint = cc.p( this.m_nHonorSpriteWidth * this.m_nCurrentSpriteIndex , 0 );
        }
        scrollview.scrollToOffset( scrollEndPoint , playAnimationTime );

    }

这里先是判断方向,是个枚举,对参数二进行判断,后面又对参数三进行判断,而且还是不同类型,在同一级的判断里,这都是不允许的.
应该写成如下样子:


    /**
     * 图片滑动
     * @param scrollview scrollview
     * @param dirction 滑动方向
     * @param distance 滑动距离
     */
    private UpdateScrollviewHonorSpritesContainer( scrollview:cc.ScrollView , dirction:EnumSlideDirection , distance:number ) : void
    {
        if( scrollview == null )
        {
            cc.warn("DlgHonor.UpdateScrollviewHonorSpritesContainer:scrollview不能为空");
            return;
        }

        let totalSpriteNumberMax = scrollview.content.children.length - 1;
        let totalSpriteNumberMin = 0;
        let playAnimationTime = 0.2;
        let scrollEndPoint = cc.Vec2.ZERO;

        this.ChangeIsPlayingAnimation(playAnimationTime);

        if ( dirction == EnumSlideDirection.eDirection_Right )//向右滑动一张图片
        {
            if ( this.m_nCurrentSpriteIndex < totalSpriteNumberMax)
            {
                this.m_nCurrentSpriteIndex += 1;
            }
            scrollEndPoint = cc.p( this.m_nHonorSpriteWidth * this.m_nCurrentSpriteIndex, 0 );
        }
        else if ( dirction == EnumSlideDirection.eDirection_Left )//向左滑动一张图片
        {
            if ( this.m_nCurrentSpriteIndex > totalSpriteNumberMin )
            {
                this.m_nCurrentSpriteIndex -= 1;
            }
            scrollEndPoint = cc.p( this.m_nHonorSpriteWidth * this.m_nCurrentSpriteIndex , 0 );
        }
        else
        {
            if ( distance != 0 ) //根据距离滑动
            {
                playAnimationTime = 0;
                scrollEndPoint = cc.p( distance , 0 );
                playAnimationTime = 0;
            }
            else//根据图片索引滑动
            {
                scrollEndPoint = cc.p( this.m_nHonorSpriteWidth * this.m_nCurrentSpriteIndex , 0 );
            }
        }
        scrollview.scrollToOffset( scrollEndPoint , playAnimationTime );

    }
尽量避免使用回调

尽量避免如下代码:

    /**
     * 界面即将退出动画 
     * @param callBack 回调
     */
    PlayAnimationOnWillDisable(callBack)
    {
        let endPosition = cc.p( - this.node.width , 0 );
        let playAnimationTime = 0.1;
        let moveAnimation=cc.moveTo(playAnimationTime,endPosition);

        this.ChangeIsPlayingAnimation(playAnimationTime);
        this.Node_playAnimation.stopAllActions();
        this.Node_playAnimation.runAction(moveAnimation);

        if ( callBack )
        {
            this.scheduleOnce(function()
            {
                callBack();
            },playAnimationTime);
        }
    }

由于是通过计算时间来回调,并不能确切地在执行完动画之后马上执行回调,这样的代码是不足的.回调函数也应尽量少用,更别在计时器里面回调.

控制做判断消耗性能

当拿一个布尔值进行判断时,不需要用”==false”之类的==号或者”!=”号,直接放在括号里面就行了,如果不是布尔值,需明确的用”==”或者”!=”来表明意思.

自定义枚举

枚举类型在自定义的时候需要给其一个默认值,即没有意义的值.如:

/**
 * 滑动方向
 */
export enum EnumSlideDirection
{
    eDirection_Defult = 0,
    eDirection_Right = 1,
    eDirection_Left = 2,
}

此处的Defult就位默认值,在做判断的时候,枚举类型不用判空,而是判默认值.

变量计算

当一个算式过长的时候需要分成多步计算,每一步有一个变量名,这样就很好理解算式的意义,容易读懂也方便日后修改,比如:

        let contentHeight = ( this.m_nGridHeight + layoutSpacingValue ) * Number( ( this.m_nTotalGridNumber / this.m_nTotalGridLineNumber ).toFixed(0) ) + 1 + layoutSpacingValue;

这样的算式应该拆分成多个,并取有意义的变量名.

        let verticalGridNumber = Number( ( this.m_nTotalGridNumber / this.m_nTotalGridLineNumber ).toFixed(0) ) + 1 ;
        let contentHeight = ( this.m_nGridHeight + layoutSpacingValue ) * verticalGridNumber + layoutSpacingValue;
<think>好的,用户想了解TypeScript的代码编写规范和最佳实践。首先,我需要整理现有的引用内容,看看有哪些相关资源可以利用。引用[1]、[3]、[4]、[5]都是关于TypeScript风格指南的开源项目,其中引用[1]和[3]提到了基于Google内部指南调整后的版本,适合开源社区。引用[5]提到的gts工具适用于团队协作和快速迭代,可以自动修复代码风格问题。引用[2]则涉及React与TypeScript的最佳实践,可能对前端开发者有帮助。 用户的问题主要集中在代码风格和最佳实践上,所以需要将这些引用中的关键点提取出来。比如命名规范、类型管理、模块导出策略、代码格式化工具等。另外,用户可能需要知道如何实际应用这些规范,比如使用ESLint或Prettier这样的工具,以及如何配置项目。 接下来,需要将这些信息结构化,分点说明,确保回答清晰。可能需要包括命名规则、类型使用建议、模块管理、工具推荐等部分。同时,要引用正确的来源,比如提到某个实践来自哪个项目指南。例如,引用[3]提到命名规则,引用[5]提到gts工具的应用场景。 还要考虑用户可能的后续问题,比如如何集成这些工具到现有项目,或者如何处理团队协作中的代码风格统一。因此,在相关问题部分可以提出这些方向,帮助用户进一步探索。 最后,检查是否符合系统级指令的要求,比如数学公式的格式是否正确,是否有生成相关问题,引用标识是否添加正确。确保回答使用中文,结构清晰,分点明确,并且引用的来源在末尾正确标注。</think>### TypeScript代码风格指南与最佳实践 以下是基于开源社区实践和主流规范的TypeScript代码编写规范总结: --- #### 一、**基础规范** 1. **命名规则** - **变量/函数**:使用`camelCase`,例如:`userId`、`getUserInfo()`[^3] - **类/接口**:使用`PascalCase`,例如:`UserService`、`IHttpClient`[^4] - **常量**:使用全大写`SNAKE_CASE`,例如:`MAX_RETRY_COUNT = 5`[^1] - **类型参数**:使用单个大写字母,例如:`type Response<T> = { data: T }` 2. **类型显式声明** - 优先使用`interface`定义对象类型,需要扩展时用`type` - 避免使用`any`,可用`unknown`代替不确定类型 - 示例: ```typescript interface User { id: string; name: string; } type UserList = User[]; ``` --- #### 、**代码结构** 1. **模块管理** - 使用ES6模块语法(`import/export`)替代`namespace`[^1] - 单个文件建议不超过400行,复杂逻辑拆分为多个工具函数 - 示例: ```typescript // 错误写法 namespace Utilities { export function formatDate() {...} } // 正确写法 export function formatDate() {...} ``` 2. **React组件规范** - 函数组件使用`FC`类型标注Props[^2] - 状态管理优先使用`useState`+类型推断 - 示例: ```typescript interface ButtonProps { onClick: () => void; disabled?: boolean; } const Button: FC<ButtonProps> = ({ onClick, disabled }) => (...) ``` --- #### 三、**工具链集成** 1. **代码格式化** - 使用`Prettier`+`ESLint`自动格式化(配置示例)[^5]: ```json { "printWidth": 100, "singleQuote": true, "trailingComma": "es5" } ``` 2. **静态检查** - 推荐使用`gts`(Google TypeScript Style)工具包,集成`ESLint`规则和自动修复 - 安装命令: ```bash npm install gts --save-dev npx gts init ``` --- #### 四、**高级实践** 1. **类型守卫优化** ```typescript function isError(response: unknown): response is Error { return (response as Error).message !== undefined; } ``` 2. **泛型约束** ```typescript function mergeArrays<T extends object>(arr1: T[], arr2: T[]): T[] { return [...arr1, ...arr2]; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值