TS语法衔接

一、TS 语法衔接 —— 你的 React 代码其实是 JS + 类型

拿出你的 TS/React 笔记里的代码,去掉类型标注,剩下的就是 JS:

 
 
 
// ===== 完整示例:interface + Props + 组件 + 调用 =====
 
 
 
 
 
// ① 定义数据类型 interface:描述"用户"长什么样
 
 
 
interface User {
 
 
 
    name: string;          // 必填:用户名
 
 
 
    age: number;           // 必填:年龄
 
 
 
    vip?: boolean;         // 可选:是不是 VIP(不传就是 undefined)
 
 
 
}
 
 
 
 
 
// ② 定义 Props 类型(业界惯例:组件名 + Props)
 
 
 
interface UserCardProps {
 
 
 
    user: User;            // user 属性的类型是 User(上面定义的 interface)
 
 
 
}
 
 
 
 
 
// ③ 组件函数:{ user } 是 JS 解构拆出 props 里的 user
 
 
 
//              : UserCardProps 是 TS 类型标注
 
 
 
function UserCard({ user }: UserCardProps) {
 
 
 
    return (
 
 
 
        <div>
 
 
 
            <h3>{user.name}</h3>
 
 
 
            <p>{user.age}岁</p>
 
 
 
            {user.vip && <span>VIP</span>}
 
 
 
        </div>
 
 
 
    );
 
 
 
}
 
 
 
 
 
// ④ 父组件中调用 UserCard,传 user 数据
 
 
 
function App() {
 
 
 
    const zhangsan: User = {               // 创建一个 User 对象
 
 
 
        name: "张三",
 
 
 
        age: 25,
 
 
 
        vip: true,
 
 
 
    };
 
 
 
 
 
    return (
 
 
 
        <div>
 
 
 
            <UserCard user={zhangsan} />   {/* 把 user 对象当 props 传给组件 */}
 
 
 
            <UserCard user={{ name: "李四", age: 30 }} />
 
 
 
            {/*                         ↑ 也可以直接写对象字面量 */}
 
 
 
        </div>
 
 
 
    );
 
 
 
}
 
 
 

逐层拆 { user }: UserCardProps

 
 
 
{  user  }  :  UserCardProps
 
 
 
    ↓              ↓
 
 
 
 JS 解构      TS 类型标注
 
 
 
 
 
解构:从 props 这个对象里,把"user"这个属性的值掏出来,直接当变量用
 
 
 
类型:告诉 TS,"props 对象的形状是 UserCardProps(里面有一个 user: User)"
 
 
 
 
 
 
// ===== 去掉类型标注,剩下的 JS 如下 =====
 
 
 
// interface User { ... }          ← 类型全部被擦除
 
 
 
// : UserCardProps                 ← 类型全部被擦除
 
 
 
// const zhangsan: User = ...      ← 类型标注没了,变成普通对象
 
 
 
 
 
function UserCard({ user }) {
 
 
 
    //               ^^^^ JS 解构:从 props 里拆出 user 属性直接用
 
 
 
    return (
 
 
 
        <div>
 
 
 
            <h3>{user.name}</h3>
 
 
 
            {/*       ↑ 对象属性访问——JS 点语法 */}
 
 
 
            {user.vip && <span>VIP</span>}
 
 
 
            {/*         ↑ && 短路——条件渲染 */}
 
 
 
        </div>
 
 
 
    );
 
 
 
}
 
 
 
 
 
function App() {
 
 
 
    const zhangsan = {                    // 普通 JS 对象,没了 : User
 
 
 
        name: "张三",
 
 
 
        age: 25,
 
 
 
        vip: true,
 
 
 
    };
 
 
 
 
 
    return (
 
 
 
        <div>
 
 
 
            <UserCard user={zhangsan} />
 
 
 
            {/*         ↑ 把对象当 props 属性传进去 */}
 
 
 
        </div>
 
 
 
    );
 
 
 
}
 
 
 

结论:你在 React 里写的每一行,底层都在跑 JS 语法。TS 只负责编译阶段检查类型——运行时全是 JS。


速记卡(面试闪卡)

Q1:一句话讲清「TS语法衔接」到底是什么?

A:TS 语法衔接点破:React 里的 TS 代码去掉类型标注后底层全是 JS;TS 只在编译期查类型,运行时跑的就是普通 JavaScript。

Q2:一个组件看清 TS + JS —— 怎么理解?

A:看 UserCard 组件:interface User 描述数据形状,{ user }: UserCardProps 里前半是 JS 解构、后半是 TS 类型标注。像快递单模板(类型)贴在包裹(值)上,运输时模板撕掉,只剩包裹跑全程。

Q3:去掉类型标注剩 JS —— 怎么理解?

A:把 interface、: UserCardProps、: User 全擦掉,剩下的 function UserCard({user}){…} 就是纯 JS。解构、点语法、&& 短路条件渲染都是 JS 原生能力。TS 像给 JS 加了层”体检”,体检报告不进产线。

Q4:为什么理解这点重要 —— 怎么理解?

A:看懂”TS 只是 JS 的编译期外衣”,就不会被类型语法吓到——调试时记住运行时根本没有类型。新人常以为 TS 改了语言,其实它只是编辑器里的红波浪线工厂。像给自行车贴赛车贴纸,骑起来还是自行车。

Q5:类型标注写在哪 —— 怎么理解?

A:TS 标注只出现在变量声明、函数参数/返回值、对象形状上,运行时全被擦除。所以同段逻辑,TS 版和 JS 版产物一致,区别只在开发期能否提前抓错。像两份菜谱,一份加了”别放盐”的提醒,做出来味道一样。

Q6:核心速记主线有哪些?

  • React 的 TS 代码去标注即 JS,底层跑 JS

  • { user }: Props 前半解构(JS)后半标注(TS)

  • TS 编译期查类型,运行时类型擦除

  • 类型只帮开发期抓错,不改变运行行为

口诀

A:TS 外衣裹 JS,编译期里查类型;

去掉标注剩原样,运行时刻全擦净。

解构是 JS 活,标注是 TS 影;

贴纸不动车,类型不进产线。

相关链接