如何在TypeScript中声明只包含对象而不包含函数的类型
在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 } &
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
,然后再执行不扩展函数的断言。