在TypeScript中,为具有必需属性的任何对象定义一种类型

哈里格

说我有一个函数,该函数接受某种具有name属性的对象它不关心对象的其他属性,只关心它name的type是string,因此它应该接受符合此条件的任何对象类型。

是否有定义这种类型的简单方法?我最接近的是扩展使用构造的类型,Record但看起来有点不雅致:

interface ThingWithName extends Record<string, any> {
    name: string
}

function greet(thing: ThingWithName) {
    return `hello, ${thing.name}`
}

greet({name: ''}) // fine
greet({name: '', age: 27}) // also fine
提香·切尔尼科娃·德拉戈米尔

您不需要为此做任何特殊的事情。这将定义所需的属性:

interface ThingWithName {
    name: string
}

function greet(thing: ThingWithName) {
    return `hello, ${thing.name}`
}

greet({name: ''}) // fine
let x = {name: '', age: 27};
greet(x) // also fine

您可能要面对的是多余的属性检查,当对象文字直接分配给特定的类型引用时,该检查会禁止额外的属性。所以在上面的代码中:greet({name: '', age: 27})将是一个错误。

您可以通过以下几种方法之一来解决此限制。

最安全的一种是使用泛型类型参数:

interface ThingWithName {
    name: string
}

function greet<T extends ThingWithName>(thing: T) {
    return `hello, ${thing.name} ${thing.age}` // age is invalid
}

greet({name: ''}) // fine
greet({name: '', age: 27}) // also fine

如果您希望能够使用索引到对象,string那么您发现扩展记录的解决方案是可以的(使用索引签名可以达到相同的效果):

interface ThingWithName extends Record<string, any> {
    name: string
}

function greet(thing: ThingWithName) {
    return `hello, ${thing.name} ${thing.age}` // age is valid, so be ware you can dot into thing with any prop 
}

greet({name: ''}) // fine
greet({ }) // err
greet({name: '', age: 27}) // also fine

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Typescript 函数参数有两种类型,一种类型的属性无法访问,因为它不是另一种类型的属性

是否可以从具有相同键名称但不同类型的值的另一种类型的对象创建一种类型的对象?

在Swift中是否有一种方法可以将泛型约束为一种类型或另一种类型?

为具有多重继承的一种类型设置默认构造函数

将一种 TypeScript 类型与对象内的另一种类型交换

在 C# 中获取一种类型的对象

Typescript通用约束,其中一种类型的属性取决于另一种类型

Typescript - 使一种类型等于另一种类型,但其属性是可选的

元素类型组合的一种解决方案,当任何一种类型可以具有零个元素时

有没有一种类型安全的方法来将较大的对象减少()为打字稿中的新类型?

打字稿中是否有一种方法可以将参数限制为对象的键之一,并且该键具有某种类型?

在Typescript中从一种类型转换为另一种类型的最佳实践方法

打字稿2.8:从另一种类型中删除一种类型的属性

如何在Typescript中使用定义为多种类型之一的变量来反对其中一种类型的数组?

核心数据中具有自定义类型的所有属性都必须是一种关系吗?

如何在TypeScript中为具有动态属性的对象定义类型

一种将 Haskell 的任何类型概括为任意多种类型的方法?

从具有两种类型的对象的列表中获取ComboBox选定的值,并且组合框仅显示其中一种

无法将具有tomcat的intellij上的java ee maven项目解析为一种类型

打字稿:是否有一种简单的方法可以将一种类型的对象数组转换为另一种类型

如何将对象转换为另一种类型并删除TypeScript中不需要的字段?

有没有办法在Java中仅允许将一种类型用作属性?

在TypeScript中定义具有多种类型的数组

如何仅通过一种类型引用具有多种模板类型的类?

如何在数组元素具有不止一种类型的 Go 中解析 JSON?

如何将一个对象定义为一种类型,然后再将其声明为子类型?

如何从一种类型反序列化 JSON 上的属性,但将其序列化为具有相同名称的另一种类型?

EF核心支持字段-将属性公开为另一种类型?

如何接受两种类型中的任何一种