Dir*_*Jan 7 generics default-value typescript
所以我想写一个函数,它有一个泛型,它扩展了某个对象,从而限制了它。接下来,我想将此泛型与参数定义一起使用以生成新的“增强型”参数。这一切都很好,但是一旦我想为参数引入默认值,TypeScript 就会抱怨以下消息(在操场上有一些不同的变体):
功能:
const test1 = <T extends { foo?: string }>(options: T & { bar?: boolean } = {foo:
''}) => {
console.log(options);
}
Run Code Online (Sandbox Code Playgroud)
错误:
输入 '{ foo: 字符串; }' 不能分配给类型 'T & { bar?: boolean; }'。对象字面量可能只指定已知属性,但在类型 'T & { bar?: boolean; 中不存在 'foo'。}'。你的意思是写'foo'吗?
编译器警告我,我可能想使用 foo,我确实这样做了。是否根本不可能以这种方式使用泛型,或者这是 TypeScript 中的错误?
T定义时的类型是未知的,因此编译器会抛出此错误,表明您无法初始化您不知道的东西。我可以想到一些解决方法,但不确定它们对您的情况有多大用处。
您可以保留类型T不变,并使用联合类型作为options参数,如下所示:
const test1 = <T> (options: T | { bar?: boolean } | { foo?: string } = { foo: '' }) => {
console.log(options);
};
Run Code Online (Sandbox Code Playgroud)
另一种解决方法是使用类型断言并手动告诉编译器初始化程序是它需要的类型:
const test2 = <T extends { foo?: string }>(options: T & { bar?: boolean } = { foo: '' } as T & { bar?: boolean }) => {
console.log(options);
};
Run Code Online (Sandbox Code Playgroud)
但请记住,这些只是解决方法,每当您必须使用解决方法时,就意味着设计中存在缺陷。也许您可以重新审视您的逻辑并改进它,以便消除对这些解决方法的需要。或者,您可以跳过参数初始化并将其添加options.foo = options.foo || '';为函数中的第一行代码。只是一些想法。
| 归档时间: |
|
| 查看次数: |
2510 次 |
| 最近记录: |