type Numbers = {
  a: number;
  b: number;
  f: number;
};

type SameKeysWithNeyTypes = SomeThingKeyOf<Numbers> & {
  a: string; 
  b: Date;
  c: null;   // Error here because c is not in Numbers ?
  // Error because f is missing
}

我该怎么办? 基本上,SameKeysWithNeyTypes类型的密钥是从Numbers中的密钥验证的,但有可能逐个改变它们的类型?

推荐答案

你可以将它定义为一个generic实用程序类型HasSameKeysAs<T, U>,它的计算值总是为U,但除非它有与T完全相同的键,否则它会抱怨:

type HasSameKeysAs<
  T, U extends {
    [P in keyof T | keyof U]: P extends keyof T ? any : never
  }> = U;

这是因为U对于依赖于TU的类型来说是constrained.我们在TU的两个键上都有map.任何存在于T中的密钥都将被要求并允许为任何东西(与any),而存在于U中但不存在于T中的任何密钥将被强制为不可能的never类型,这基本上禁止了它(好吧,它允许never,但这不太可能意外地出现).至少对于你的示例用例来说没有).

让我们试试看:

type SameKeysWithNeyTypes = HasSameKeysAs<Numbers, {
  a: string;
  b: Date;
}> // error!
// Property 'f' is missing in type '{ a: string; b: Date; }' 
// but required in type '{ a: any; b: any; f: any; }'.

type SameKeysWithNeyyTypes = HasSameKeysAs<Numbers, {
  a: string;
  b: Date;
  c: null;
  f: 1;
}> // error!
// Types of property 'c' are incompatible.

type SameKeysWithNeyyyTypes = HasSameKeysAs<Numbers, {
  a: string;
  b: Date;
  f: 1;
}> // okay

看起来不错缺少键和额外键会导致错误,而具有完全相同键的类型工作正常.

Playground link to code

Typescript相关问答推荐

当类型断言函数返回假时,TypScript正在推断从不类型

参数类型undefined不能分配给参数类型字符串|未定义

如何在TypeScrip中使用嵌套对象中的类型映射?

如何使用Zod使一个基于其他字段值的字段为必填字段?

类型脚本中没有接口的中间静态类

APIslice-CreateAPI的RTK打字错误

为什么在回调函数的参数中不使用类型保护?

是否可以针对联合类型验证类型属性名称?

尽管对象的类型已声明,但未解析的变量<;变量

使用TypeScrip的类型继承

下载量怎么会超过下载量?

如何从输入中删除值0

重写返回任何

埃斯林特警告危险使用&as";

在TS泛型和记录类型映射方面有问题

仅当类型为联合类型时映射属性类型

从泛型对象数组构造映射类型

必须从注入上下文调用Angular ResolveFn-inject()

基于参数的 TS 返回类型

是否有可能不允许在 TypeScript 中设置类属性,但也会抛出运行时错误?