如何在TypeScript中声明只包含对象而不包含函数的类型

mrzz3bfm  于 2023-05-19  发布在  TypeScript
关注(0)|答案(1)|浏览(182)

在TypeScript中,是否有可能定义一个类型,使其只包含对象而不包含函数?
示例:

type T = { [name: string]: any } // How to modify this to only accepts objects???

const t: T = () => {} // <- This should not work after modification

谢谢你的帮助。

3pvhb19x

3pvhb19x1#

没有完美的方法来引用像“一个不是函数的对象”这样的类型,因为这需要真正的subtraction types,而这在TypeScript中不存在(至少在3.1中)。
一个简单的解决方法是查看Function接口,并描述一些绝对不是Function的东西,但它可以匹配您可能遇到的大多数非函数对象。示例:

type NotAFunction = { [k: string]: unknown } & ({ bind?: never } | { call?: never });

这意味着“一个带有一些未指定键的对象,它要么缺少bind属性,要么缺少call属性”。让我们看看它是如何工作的:

const okayObject: NotAFunction = { a: "hey", b: 2, c: true };
const notOkayObject: NotAFunction = () => {}; // error, call is not undefined

很好。
这是一种变通方法,而不是一种直接的解决方案,原因是一些非函数可能同时具有callbind属性,这只是巧合,你会得到一个不希望的错误:

const surprisinglyNotOkay: NotAFunction = { 
  publication: "magazine", 
  bind: "staples",
  call: "867-5309",
  fax: null
}; // error, call is not undefined

如果你真的需要支持这样的对象,你可以将NotAFunction修改得更复杂,并排除更少的非函数,但定义可能总是会出错。这取决于你how far you want to go

相关问题