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

如何在TypeScript中声明只包含对象而不包含函数的类型,typescript,typescript-typings,typescript-types,Typescript,Typescript Typings,Typescript Types,在TypeScript中,是否有可能定义一个类型,使其只包含对象而不包含函数 例如: type T = { [name: string]: any } // How to modify this to only accepts objects??? const t: T = () => {} // <- This should not work after modification type NotAFunction = { [k: string]: unknown } &

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

例如:

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

const t: T = () => {} // <- This should not work after modification
type NotAFunction = { [k: string]: unknown } & ({ bind?: never } | { call?: never });
typet={[name:string]:any}//如何将其修改为仅接受对象???

const t:t=()=>{}/没有完美的方法来引用“不是函数的对象”这样的类型,因为这需要true,而TypeScript中不存在这种类型(至少从3.1开始)

一个足够简单的解决方法是查看并描述一些肯定不是
函数的东西,但它会匹配您可能遇到的大多数非函数对象。例如:

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

这是一个变通方法,而不是一个简单的解决方案,原因是某些非函数可能同时具有
调用
绑定
属性,这只是巧合,并且您将得到一个不希望出现的错误:

const surprisinglyNotOkay: NotAFunction = { 
  publication: "magazine", 
  bind: "staples",
  call: "867-5309",
  fax: null
}; // error, call is not undefined
如果您确实需要支持此类对象,可以将
notaffunction
更改为更复杂,并排除更少的非函数,但定义可能总会出错。这取决于你


希望有帮助。祝你好运

我完全理解你的问题,但我只是想在这里扮演魔鬼代言人的角色,如果一个函数包含了你所期望的所有属性,那么有人传入它会有什么问题呢?这是关于用算术1重载一个函数:第一个签名用于对象参数,第二个签名用于函数参数。在我的代码中,编译器总是使用第一个签名(对于对象和函数),这导致了非预期的类型推断。在我的特殊情况下,解决办法是改变签名声明的顺序。希望你能明白我的意思。意思是:我的问题解决了,但是我仍然对我上面问题的答案感兴趣。。。顺便说一句:像排除这样的东西似乎也不起作用……这是有道理的。据我所知,它需要运行时检查来区分函数和普通对象,因为在JavaScript中函数是对象。我认为
Exclude
不起作用,因为赋值将函数的类型扩展为
t
,然后再执行不扩展
函数的断言。