因此,我试图编写一个具有泛型的函数,它扩展了某个对象,从而限制了它。接下来,我想使用这个泛型和参数的定义一起生成一个新的“增强”参数。这一切都很好,但只要我想为参数引入默认值,TypeScript就会发出如下消息( 游乐场中有一些不同的变体)
功能:
const test1 = <T extends { foo?: string }>(options: T & { bar?: boolean } = {foo:
''}) => {
console.log(options);
}错误:
键入“{ foo: string;}”不能指定键入“T&{ bar?:boolean;}”。对象文字只能指定已知的属性,但类型'T &{ bar?:boolean;}‘foo’不存在。你是想写'foo‘吗?
编译器警告我,我可能想使用foo,而实际上我确实使用了foo。以这种方式使用泛型是根本不可能的,还是TypeScript中的一个bug?
发布于 2018-03-14 23:43:11
定义时输入T是未知的,因此编译器抛出此错误,无法初始化您不知道的内容。有几个解决办法我能想到,但不确定它们对你的情况有多有用。
您可以保持T类型不变,并将联合类型用于options参数,如下所示:
const test1 = <T> (options: T | { bar?: boolean } | { foo?: string } = { foo: '' }) => {
console.log(options);
};另一个解决方法是使用类型断言,并手动告诉编译器初始化程序的类型是它需要的类型:
const test2 = <T extends { foo?: string }>(options: T & { bar?: boolean } = { foo: '' } as T & { bar?: boolean }) => {
console.log(options);
};但请记住,这些只是解决办法,每当您必须使用解决方案时,它就意味着设计中的一个缺陷。也许您可以重新审视您的逻辑,并改进它,以消除对这些解决方案的需求。或者,您可以跳过参数初始化,将options.foo = options.foo || '';作为函数中的第一行代码添加。只是一些想法。
发布于 2018-03-14 21:31:41
初始化不起作用的原因是无法初始化不知道的内容。考虑以下呼吁:
test1<{ foo: string, goo: boolean}>();泛型参数对于函数是有效的,但是它有一个额外的属性goo,它是强制性的,但是在选项的默认值中没有指定。这就是为什么编译器会抱怨赋值,您不知道T的最终形状,您只知道它的最低要求,所以您不能构建一个与T兼容的对象
如果您认为options没有在泛型类型参数上指定所有强制属性,则可以使用类型断言。
const test1 = <T extends { foo?: string }>(options: T & { bar?: boolean } = <any>{foo: ''}) => {
console.log(options);
}https://stackoverflow.com/questions/49287376
复制相似问题