【问题标题】:What is abc<xyz> in typescript什么是打字稿中的 abc<xyz>
【发布时间】:2023-04-10 18:40:02
【问题描述】:

我是 ts 新手

我的这段代码

import service from "feathers-mongoose";

app.use("/orders", service({
    CustomerModel
}));

Typescript 抛出以下错误

类型参数 '{ CustomerModel: Model; }' 不是 可分配给“部分”类型的参数。
对象字面量只能指定已知属性和“CustomerModel” 在“部分”类型中不存在。

我的客户模型如下所示

import mongoose from "mongoose";

const Schema = mongoose.Schema;

const customerSchema = new Schema(
  {
    firstName: { type: String, required: true },
    lastName: { type: String, required: true },
    email: { type: String, required: true },
  },
  {
    timestamps: true,
  }
);

const Model = mongoose.model("customers", customerSchema);

export default Model;

谁能给我解释一下Partial&lt; MongooseServiceOptions&gt;是什么意思

另外,我知道这可能是在 stackoverflow 上已经提出的问题之一,但我在谷歌上搜索了完全相同的短语,但我找不到任何东西。

【问题讨论】:

  • 不是一个完整的答案,但您正在寻找的是 Generics

标签: typescript mongoose feathersjs


【解决方案1】:

我没有使用feathers-mongoose 的经验,所以我无法帮助您调试您的具体问题,但我或许可以提供一些关于Partial 类型的见解。

泛型

正如其中一位 cmets 所述,Partialgeneric。考虑泛型的一个有用方法是类型函数。类似于函数只是接受一个输入并产生一个输出的东西,泛型允许我们提供一个类型作为输入并接收一个type 作为输出。

让我们以Array 泛型为例。 Array 本身并不是一种类型。毕竟,我们必须知道它是什么类型的数组——它是字符串数组、数字数组还是其他类型的数组?

现在,还记得我说过泛型就像类型函数吗?就像普通函数将变量作为输入一样,泛型将类型变量作为输入。通过向Array 提供一个类型变量,我们可以指定我们想要什么样的数组。例如,我们可以使用Array&lt;string&gt; 语法将string 作为类型变量传递给Array(请注意,这与普通函数语法非常相似;唯一的区别是我们使用尖括号而不是圆括号)。这是一个例子:

const stringArray: Array<string> = ['a', 'bunch', 'of', 'strings']
const numberArray: Array<number> = [1, 2, 3, 4, 5]

如您所见,通用Array 允许我们定义本质上的无限 类型。我们可以定义Array&lt;boolean&gt;Array&lt;Person&gt;Array&lt;Dog&gt;等。事实上,type[]的语法在功能上等同于Array&lt;type&gt;

部分

现在,让我们回到PartialPartial 是 TypeScript 定义的特殊泛型,它使接口的所有字段都是可选的。例如,如果我们有接口:

interface Person {
  name: string
  age: number
  favoriteColor: string
}

Partial&lt;Person&gt; 相当于这个接口:

interface MaybeAPerson {
  name?: string
  age?: number
  favoriteColor?: string
}

如您所见,泛型再次允许我们定义新的有用类型,而无需编写一堆重复的代码。

Partial 是如何实现的?

这有点超出了问题的范围,但我认为包含Partial 的实现方式可能很有用,因为它可以在本机 TypeScript 中完成。这是documentation 中给出的实现:

type Partial<T> = {
  [P in keyof T]?: T[P]
}

让我们分解一下:

  1. &lt;T&gt;(在Partial 旁边)表示Partial 是具有单一类型变量T 的泛型。
  2. keyof T 将类型变量 T 的键列为联合类型。例如,如果T 是我上面定义的Person 类型,keyof T 将给我们'name' | 'age' | 'favoriteColor' 类型。
  3. [P in keyof T]T 的键映射到Partial&lt;T&gt; 的键。如果我们要定义Partial&lt;Person&gt;[P in keyof T] 会将其键设置为nameagefavoriteColor
  4. T[P] 将每个键的值设置为原始类型。
  5. ? 将所有键设置为可选。

如果这没有意义,请不要担心。简单来说,所有这些花哨的语法所做的就是将类型变量 T 复制到 Partial&lt;T&gt; 中,但使所有字段都是可选的。

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 2017-05-25
    • 1970-01-01
    • 2016-04-08
    • 2017-01-30
    • 2017-01-23
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多