Typescript学习:联合类型、交叉类型、映射类型、箭头函数ts写法

本文介绍了TypeScript的基本类型如number,string,boolean,联合类型用于处理多种可能的类型,泛型在函数和接口中的应用,以及交叉类型和any、unknown类型的使用。同时,还展示了映射类型的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本类型

 const a: number = 1;
 console.log('a', a); // 1
 const b: string = 'Hello';
 console.log('b', b);// Hello
 const c: boolean = true;
 console.log('c', c); // true

联合类型

type NumOrStr = number | string;

场景: 一个函数的参数变量支持传入单个数据和多条数据,我们可以通过联合类型来支持这样场景

 let a : number | string = 0;
 console.log('a-1', a);// 0
 
 a = 'hello';
 console.log('a-2', a);// hello

箭头函数写泛型

const getValue = <T, > (value:T):T => value;

const b = getValue('hello');
console.log('b', b);
  
const b1 = getValue(5);
console.log('b1', b1);



interface Props {
  name?: string;
  age?: number;
}
const getValue = <T extends Props>(value: T): T => value;

const a = getValue({ name: 'HYU' });
const a1 = getValue({ name: 'HYU', age: 18 });
const a2 = getValue({ age: 20 });
console.log('a', a); // {name: 'HYU'}
console.log('a1', a1); // {name: 'HYU', age: 18}
console.log('a2', a2); // {age: 20}

普通函数写泛型

interface Props {
  name?: string;
  age?: number;
}
function getValue<T extends Props> (value: T) {
  return value;
}
const a = getValue({ name: 'HYU' });
const a1 = getValue({ name: 'HYU', age: 18 });
const a2 = getValue({ age: 20 });
console.log('a', a); // {name: 'HYU'}
console.log('a1', a1); // {name: 'HYU', age: 18}
console.log('a2', a2); // {age: 20}
function getValue<T> (value: T):T {
  return value;
}
const a = getValue({ name: 'HYU' });
const a1 = getValue({ name: 'HYU', age: 18 });
const a2 = getValue({ age: 20 });
console.log('a', a); // {name: 'HYU'}
console.log('a1', a1); // {name: 'HYU', age: 18}
console.log('a2', a2); // {age: 20}

泛型变量可以是任意字母,常见的泛型变量定义有:

  • T(Type)代表任意事物的类型;
  • K(Key)表示对象中键的类型;
  • V(Value)表示对象中值的类型;
  • E(Element)表示元素类型;

交叉类型

通过交叉运算符 & 对多个类型进行交叉合并,新类型拥有所有类型的成员。

  interface Point {
    name: string;
    width: number;
    height: number;
    c: number;
  }
  interface Surface {
    size: number
    c: string;
  }

Point & Surface =>

  {
    name: string;
    width: number;
    height: number;
    size: number;
    c: never;
  }

在这里插入图片描述


  const a : (Point & Surface) = {
    name: 'THIS',
    width: 200,
    height: 100,
    size: 2000,
    c: [1, 3, 4]
  };
  console.log('a', a);
  

any 类型 和 unknown 类型

  • any 类型,这和没有引入 TS,纯 JS 使用体验没有差别;你可以将任意类型值赋给 any 类型的变量,并对该变量进行任何操作。
  • unknown 类型,你可以把任意类型值赋给 unknown 类型的变量,但在使用这个变量时必须进行类型检查或类型断言。

映射类型

type Keys = 'name';
type Sizes = 'width' | 'height'
type Point = {
  [k in Keys]: string
} & {
    [k in Sizes]: number
  } & { size: number }

const a: Point = {
  name: 'THIS',
  width: 200,
  height: 100,
  size: 2000,
};
console.log('a', a);
<think>好的,我现在需要帮助用户找到在TypeScript中defineProps的类型定义。首先,用户提供的引用内容主要涉及Vue 3中使用defineProps的不同方式,特别是运行时声明和基于类型的声明。用户可能在使用TypeScript时遇到了如何正确定义props类型的问题,或者想了解defineProps在TypeScript中的类型定义结构。 根据引用[2]和[3],defineProps有两种用法:一种是传统的运行时声明,使用对象形式定义props的类型和验证规则;另一种是基于TypeScript,直接通过参数指定props的类型。用户可能想了解这两种方式在TypeScript中的具体类型定义,以及如何正确使用它们。 引用[5]提到使用withDefaults来为props提供默认值,尤其是在使用基于类型的声明时。这可能意味着当使用定义props时,默认值需要额外处理,而运行时声明则可以直接在对象中设置default属性。因此,用户可能想知道这两种方式在类型定义上的区别,以及如何结合TypeScript来确保类型安全。 接下来,我需要查看Vue 3的官方文档,特别是关于组合式API和TypeScript的部分。根据引用[4],Vue 3官网提到可以使用接口来定义props的类型,并通过传递给defineProps。同时,引用[5]中的示例展示了如何为复杂类型定义props,并使用withDefaults来设置默认值。 综合这些信息,defineProps在TypeScript中的类型定义主要依赖于参数。当使用基于类型的声明时,defineProps接受一个参数,该参数是一个对象类型,定义了各个props的名称和类型。例如,defineProps<{ money: number, car?: string }>()。这种方式下,Vue会在编译时进行类型检查,而不是在运行时。 对于运行时声明,类型定义是通过PropType来指定更复杂的类型,如引用[1]中的例子,使用String as PropType<'on' | 'off'>来限制status的可能值。这种情况下,类型检查发生在运行时,但PropType允许结合TypeScript类型系统来增强类型安全。 总结起来,用户可能需要了解两种方式的类型定义方法,以及如何选择适合自己项目的方式。需要指出的是,基于类型的声明(使用)是Vue 3推荐的方式,因为它能更好地利用TypeScript的静态类型检查,减少运行时开销,并且代码更简洁。 最后,用户的问题可能涉及到如何在TypeScript项目中正确定义props的类型,确保类型安全和正确的默认值处理。因此,回答中需要明确两种方法的类型定义方式,并举例说明,同时引用官方文档和相关示例来支持说明。</think>在 Vue 3 的 TypeScript 项目中,`defineProps` 的类型定义分为两种模式,以下是具体说明: --- ### 一、基于类型的声明(推荐) 通过参数直接定义 props 的**静态类型**,Vue 会在编译阶段进行类型检查,无需额外运行时验证。 **语法结构**: ```typescript const props = defineProps<{ 属性名: 类型 属性名?: 可选类型 // 可选参数 }>(); ``` **示例**: ```typescript // 直接定义类型 const props = defineProps<{ title: string count: number disabled?: boolean items: Array<{ id: number; value: string }> }>(); ``` **复杂类型处理**: 若需要定义接口或联合类型,可使用 `interface` 或 `type`: ```typescript interface Item { id: number label: string } defineProps<{ list: Item[] mode: 'edit' | 'preview' }>(); ``` **默认值设置**: 需配合 `withDefaults` 工具函数[^5]: ```typescript const props = withDefaults(defineProps<{ color?: string size?: number }>(), { color: 'red', size: 12 }); ``` --- ### 二、运行时声明(兼容传统写法) 使用 Vue 的 `PropType` 工具类型定义**运行时类型验证**,类型检查发生在代码执行阶段。 **语法结构**: ```typescript import { PropType } from 'vue' defineProps({ 属性名: { type: 具体类型 as PropType<TS类型>, required: true, default: 默认值 } }) ``` **示例**: ```typescript defineProps({ status: { type: String as PropType<'on' | 'off'>, // 限定特定字符串值 required: true }, metadata: { type: Object as PropType<{ id: number; data: string }>, default: () => ({ id: 0, data: '' }) } }); ``` --- ### 三、类型定义源码参考 在 Vue 类型声明文件(如 `vue.d.ts`)中,`defineProps` 的定义如下: ```typescript declare function defineProps<PropsOptions = {}>(): PropsOptions; ``` 当传递参数时,TypeScript 会将其映射为组件的 props 类型[^2][^4]。 --- ### 两种模式对比 | 特性 | 基于类型的声明 | 运行时声明 | |---------------------|--------------------------|--------------------------| | **类型检查阶段** | 编译时 | 运行时 | | **代码简洁度** | 更简洁 | 需显式类型转换 | | **默认值支持** | 需 `withDefaults` | 直接通过 `default` 属性 | | **复杂类型支持** | 原生 TS 类型 | 需配合 `PropType` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值