gpt4 book ai didi

带有扩展参数和默认参数的 TypeScript 泛型约束

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:16 27 4
gpt4 key购买 nike

所以我正在尝试编写一个具有泛型的函数,它扩展了某个对象从而限制了它。接下来,我想将此泛型与参数定义一起使用以生成新的“增强”参数。这一切都很好,但是一旦我想为参数引入默认值,TypeScript 就会提示一条消息如下(在 playground 中有一些不同的变体):

功能:

const test1 = <T extends { foo?: string }>(options: T & { bar?: boolean } = {foo: 
''}) => {
console.log(options);
}

错误:

Type '{ foo: string; }' is not assignable to type 'T & { bar?: boolean; }'. Object literal may only specify known properties, but 'foo' does not exist in type 'T & { bar?: boolean; }'. Did you mean to write 'foo'?

编译器警告我可能想使用 foo,而我确实这么做了。是否根本不可能以这种方式使用泛型,或者这是 TypeScript 中的错误?

最佳答案

Type 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 || ''; 作为函数中的第一行代码。只是一些想法。

关于带有扩展参数和默认参数的 TypeScript 泛型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com