首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有扩展参数和默认参数的TypeScript通用约束

具有扩展参数和默认参数的TypeScript通用约束
EN

Stack Overflow用户
提问于 2018-03-14 20:48:30
回答 2查看 5.3K关注 0票数 9

因此,我试图编写一个具有泛型的函数,它扩展了某个对象,从而限制了它。接下来,我想使用这个泛型和参数的定义一起生成一个新的“增强”参数。这一切都很好,但只要我想为参数引入默认值,TypeScript就会发出如下消息( 游乐场中有一些不同的变体)

功能:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-14 23:43:11

定义时输入T是未知的,因此编译器抛出此错误,无法初始化您不知道的内容。有几个解决办法我能想到,但不确定它们对你的情况有多有用。

您可以保持T类型不变,并将联合类型用于options参数,如下所示:

代码语言:javascript
复制
const test1 = <T> (options: T | { bar?: boolean } | { foo?: string } = { foo: '' }) => {
  console.log(options);
};

另一个解决方法是使用类型断言,并手动告诉编译器初始化程序的类型是它需要的类型:

代码语言:javascript
复制
const test2 = <T extends { foo?: string }>(options: T & { bar?: boolean } = { foo: '' } as T & { bar?: boolean }) => {
  console.log(options);
};

但请记住,这些只是解决办法,每当您必须使用解决方案时,它就意味着设计中的一个缺陷。也许您可以重新审视您的逻辑,并改进它,以消除对这些解决方案的需求。或者,您可以跳过参数初始化,将options.foo = options.foo || '';作为函数中的第一行代码添加。只是一些想法。

票数 6
EN

Stack Overflow用户

发布于 2018-03-14 21:31:41

初始化不起作用的原因是无法初始化不知道的内容。考虑以下呼吁:

代码语言:javascript
复制
test1<{ foo: string, goo: boolean}>();

泛型参数对于函数是有效的,但是它有一个额外的属性goo,它是强制性的,但是在选项的默认值中没有指定。这就是为什么编译器会抱怨赋值,您不知道T的最终形状,您只知道它的最低要求,所以您不能构建一个与T兼容的对象

如果您认为options没有在泛型类型参数上指定所有强制属性,则可以使用类型断言。

代码语言:javascript
复制
const test1 = <T extends { foo?: string }>(options: T & { bar?: boolean } = <any>{foo: ''}) => {
    console.log(options);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49287376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档