我有一个返回一个对象的函数。稍后,这个对象将被扩展为属性(例如$watch
):
export default () => {
const myObject = {
property1: 'string1',
property2: 1,
init() {
console.log('property1', this.property1)
this.$watch('property1', (value) => {
console.log('property1 changed', value)
})
},
}
return myObject
}
个字符
有没有办法将OtherProps
的属性注入到myObject
中,这样TypeScript就不会说Property '$watch' does not exist on type ...
了?
我设法以这种方式输入它,但它对我的口味来说有点过于冗长,因为我必须单独输入定义:
type WithProps<T> = ThisType<T & OtherProps<T>>
type Test = WithProps<{
property1: string
property2: number
init(): void
}>
export default () => {
const myObject: Test = {
property1: 'string1',
property2: 1,
init() {},
}
return myObject
}
型
我发现this answer似乎工作得很好,但我很难适应我的情况。
2条答案
按热度按时间liwlm1x91#
如果希望Typescript将generic类型参数推断为
WithProps
,则需要编写一个泛型辅助函数。类型参数推断仅在调用泛型 * 函数 * 时发生;泛型 * 类型 * 没有类似的行为。下面是一种方法:字符串
这样,你就不用写
const myObj: WithProps<{⋯}> = {⋯}
了,你可以写const myObj = withProps({⋯})
,myObj
的类型会自动被推断出来。我不知道你真的需要WithProps
类型,所以我只是在上面内联了它。哦,你真的需要T & ThisType<T & OtherProps<T>>
而不仅仅是ThisType<T & OtherProps<T>>
。没有T &
,你会得到由神奇的/内在的ThisType
实用程序类型提供的上下文this
行为,但是对象的结果类型将与T
无关。好吧,让我们试试:
型
看起来不错。
init()
中的this
类型知道属性,也知道$watch
。x
的推断类型是型
其行为如指定的:
型
Playground链接到代码
pgccezyw2#
我能想到的最好的方法是使用函数this type来告诉TypeScript
this
将引用什么:function myFn<T extends { ... }>(this: T){}
个这样做意味着你可以告诉TypesScript
this
必须有一些现有的属性。下面是我提出的
init
函数声明:字符串
然后,无论实际添加
$watch
的函数是什么,都应该返回修改了this
的新对象:型
可能还有其他我不知道的魔法方法,但这就是我要做的。