TS解构赋值
解构赋值一般是对某个对象进行使用的。简单来说,就是将其中的属性拆分出来,然后将其赋值给局部变量。这个在函数中,有时会写成一个不是很好读的形式,但也是使用比较多的,这里要记录一下。
// 定义一个类型
interface FuncOptions {
name: string;
age?: number;
verbose?: boolean;
}
// 函数签名就清爽了
function func({ name, age = 18, verbose = false }: FuncOptions) {
// ...
}
这里说白了就是先定义了一个接口,该接口是一个包含若干属性的对象。在定义函数时,直接从这个对象中解构出所需的元素,并使用等号(=)为其赋了一个默认值。这里最大的坑就是后面的 FuncOptions:它既可以是一个定义好的对象,也可以是一个直接写在花括号里的对象,现场给你来了一个。
// 下面 ?: 指的是可选属性,换言之就是 age 可以不给
function createUser({ name, age = 18 }: { name: string; age?: number }) {
// ╰─────┬──────╯ ╰───────────┬────────────╯
// 解构 + 默认值 类型标注
}
createUser({ name: "Alice" }); // age 默认 18
createUser({ name: "Bob", age: 25 }); // age 是 25
除此之外,JavaScript 的语法糖 TypeScript 这边也是完全继承的。一个经典的方式就是对象属性简写,具体代码可以看下面这些:
const adapter = new PrismaD1(db); // 1. 变量名叫 adapter
// 2. PrismaClient 要求配置对象里有个属性叫 adapter
// 3. 名字撞上了,可以简写
new PrismaClient({ adapter });
// 等同于:
new PrismaClient({ adapter: adapter });
// 如果这里的 adapter 不叫这个名字而是其他的话,它就会直接失效了
const myD1 = new PrismaD1(db); // 变量名叫 myD1,那就要显式指定
new PrismaClient({ adapter: myD1 });
// ❌ 错误写法:
// new PrismaClient({ myD1 });
// 这样写变成传了 { myD1: myD1 },但 Prisma 不认识 myD1 这个属性,只认识 adapter。