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。