我创建了一个函数,它接受两个体系 struct 的参数.我不执行规则来给用户灵活性,这是我现在头疼的?.不管怎么说.

我想判断一下这个条目有没有第一层的功能.例如:

//  Function in first level

const entry = {
  data: 10,
  upload:() => {},
  otherData: {},
  download: () => {}
}

// Function in deep level
const entry = {
  photo: {
   total: 10,
   upload: () => {}
  },
  videos: {
    total: 10,
    upload:() => {}
  }
}

如果TypeScrip在第一层找到一个函数,我希望它返回类型"Slice",即使函数也存在于深层.一旦它发现第一级的函数,它应该停止判断并返回"Slice".

如果第一级不存在任何函数,则应返回"group".不需要判断其他级别.

Note:返回值应为slicegroup,而不是联合slice | group

slice如果函数存在于第一级,否则返回group

要通过我的所有测试用例(除了一个测试用例),最接近的解决方案是像这样undo撤消我的判断

type GetType<S, k = keyof S> = S[k & keyof S] extends Exclude<S[k & keyof S],Function> ?  "group" : "slice"

工作正常,但失败,并将空对象作为属性并返回group

// ❌ This fail and give group as type. Expected type is slice 
const entry = {
  data: {} // empty object,
  upload: () => {}
}

// ✅ This works and give slice as type as Expected 
const entry = {
  data: any value // empty object,
  upload: () => {}
}

所以,是的,我们可以找到一个排除{}的方法.这导致了所有的问题.也许我累了,我看不清楚了,?.不管怎样,我需要一个新的视角来帮助我.

Playground link

推荐答案

当您想要一个只关心对象类型的属性子集的类型时,那么用于过滤的映射类型通常就是您想要的.

一般来说,避免对大型、复杂的对象类型进行类型比较是好的,您应该比较更多的原子位.这是因为有很多东西可能会略有不同,很难调试.

因此,我提出了一个更冗长但更容易获得正确策略的策略.首先查找所有属于函数的属性,然后判断是否找到任何属性.

因此,第一步:

type KeysWithFunctions<T> = {
    [K in keyof T]:
        T[K] extends (...args: unknown[]) => unknown
            ? K
            : never
}[keyof T]

这将返回一个类型,该类型是作为函数的属性名称的联合.如果没有匹配的属性,则没有成员的并集仅为never.

就这样.

type A = { a: 123, b: () => void, c: () => boolean } // 'a' | 'b'
type B = { a: 123 } // never

现在GetType只是never的一张支票.

type GetType<T> =
    KeysWithFunctions<T> extends never
        ? 'group'
        : 'slice'

我认为这符合你的要求:

type A = GetType<{ data: {}, upload(): void }>
//   slice

type B = GetType<{ data: {} }>
//   group

type C = GetType<{ data: {}, nested: { data2: 20, fn: () => void } }>
//   group

See Playground

Typescript相关问答推荐

如何在类型脚本中声明对象其键名称不同但类型相同?

Typescript对每个属性具有约束的通用类型

如果我有对象的Typescript类型,如何使用其值的类型?

如何防止TypeScript允许重新分配NTFS?

在映射类型中用作索引时,TypeScrip泛型类型参数无法正常工作

使某些(嵌套)属性成为可选属性

通配符路径与每条路径一起显示

参数属性类型定义的REACT-RUTER-DOM中的加载器属性错误

类型脚本映射类型:从对象和字符串列表到键值对象

分解对象时出现打字错误

使用订阅时更新AG网格中的行

Angular 17子路由

类型脚本-在调用期间解析函数参数类型

如何将类似数组的对象(字符串::匹配结果)转换为类型脚本中的数组?

如何为带有参数的函数类型指定类型保护?

类型脚本中函数重载中的类型推断问题

Typescript 从泛型推断类型

我是否应该在 Next.js 中的服务器组件中获取秘密数据的所有函数中使用使用服务器?

React HashRouter,单击导航栏时页面重新加载出现问题

Mongodb TypeError:类继承 events_1.EventEmitter 不是对象或 null