gpt4 book ai didi

typescript - 您可以根据类型检查对象,而不将其分配给该类型吗?

转载 作者:行者123 更新时间:2023-12-03 08:17:56 29 4
gpt4 key购买 nike

我认为展示我的意思的最好方法是使用一些代码示例:

type ObjType = {
[prop: string]: any
}

const x: ObjType = {
a: 1,
b: 'test'
}

type XType = typeof x;

XType 现在与 ObjType 相同,但我希望它具有实际对象的类型。但不会失去对象 x 必须匹配 ObjType 的选项。

有什么办法可以做到这一点吗?

最佳答案

TS4.9+ 更新

TypeScript 4.9 将引入 the satisfies operator其效果是根据类型对值进行上下文检查,而不将其分配给该类型,因此您不再需要辅助函数。它看起来像这样:

const x = {
a: 1,
b: 'test'
} satisfies ObjType // okay

type XType = typeof x;
/* type XType = {
a: number;
b: string;
} */

const oops = 123 satisfies ObjType; // error!

Playground link to code


TS4.8-的先前答案

作者:annotatingx 的类型设置为 ObjType,您已使编译器忘记了其初始值设定项的特定类型。相反,您想要检查您的值是否属于特定类型,而不将其扩展为该类型。

这被称为“satisfies 运算符”,如 microsoft/TypeScript#7481 中要求和讨论的那样。和 microsoft/TypeScript#47920 ,但尚未直接在 TypeScript 中实现。

虽然没有内置支持,但您可以通过引入 generic 来获得此效果。辅助函数:

const asObjType = <T extends ObjType>(t: T) => t;

函数asObjType仅返回其输入t,而不更改类型T,但该类型为constrainedObjType。我们可以将 asObjType 的输出分配给它,而不是将 x 注释为 ObjType。让我们看看它的实际效果:

const x = asObjType({
a: 1,
b: 'test'
});

type XType = typeof x;
/* type XType = {
a: number;
b: string;
} */

看起来不错。让我们确保它不允许非 ObjType 值:

const oops = asObjType(123); // error!
// ------------------> ~~~
// Argument of type 'number' is not assignable to parameter of type 'ObjType'

看起来也不错。

Playground link to code

关于typescript - 您可以根据类型检查对象,而不将其分配给该类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68777612/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com