typescript - 如何将接口泛型限制为仅字符串或对象或 null?
问题描述
export interface Foo<T extends string | object | null> {
bar: T;
}
type Callback<T = any> = (res: T) => void
function hydra<T extends string | object | null>(callback: Callback<Foo<T>>) {
callback({
bar: 'Hello World'
});
}
我不工作。它抛出这个错误:
Type '"Hello World"' is not assignable to type 'T'.
'"Hello World"' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string | object | null'.
我该如何解决这个问题?
解决方案
这里的主要问题是,尽管文字Hello World
可以分配给 a string
,但具有通用参数(作为约束)的事实依赖于可能不满足的子string
类型。Hello World
假设这种情况
type StringSubtype = 'Not Hello World';
hydra<StringSubtype>(res => {
// ...
});
函数的通用参数hydra
现在是string
. 而且,确实,它满足extends string | object | null
约束。都有效。
但是,res.bar
是类型'Not Hello World'
,这意味着没有其他字符串值可以匹配该类型。
hydra<StringSubtype>(res => {
// ...
// Type '"Hello World"' is not assignable to type '"Not Hello World"'
res = {
bar: `Hello World`
};
});
这就是您的编译错误所说的
类型“Hello World”不能分配给类型“T”。'"Hello World"' 可分配给'T' 类型的约束,但'T' 可以用约束'string | 的不同子类型实例化。对象 | 无效的'。
即使Hello World
可分配给string
,编译器也不保证它T
可以是 的子类型string
。
解决方案
只需不要将您的hydra
函数声明为通用函数。直接使用更灵活的联合类型作为类型参数Foo<>
。
function hydra(callback: Callback<Foo<string | object | null>>) {
callback({
bar: 'Hello World'
});
}
编辑:替代解决方案
- 强制转换
Hello World
为T
function hydra<T extends string | object | null>(callback: Callback<Foo<T>>) {
callback({
bar: 'Hello World' as unknown as T
});
}
T
与强制值联合
function hydra<T extends string | object | null>(callback: Callback<Foo<T | 'Hello World'>>) {
callback({
bar: 'Hello World'
});
}
但是,足够深入,如果您将值强制为res.bar
,则没有理由有任何通用参数。
但是,您的示例是一个示例,我想这应该是有原因的……我希望这三种解决方法中的任何一种都符合您的意图。
我至少解释了错误是什么。所以你可以用这些知识来实现你所需要的,我猜。
希望能帮助到你。
推荐阅读
- javascript - 如何在 Vue.js 的下拉列表中设置默认值
- php - 如何使用 php 创建 GuzzleHttp api 得到 404 错误?
- java - 无法从静态上下文错误中引用
- nestjs - NestJS 中的 Mikro-orm 服务间事务
- python - 如何从随机加权的矩阵中选择元素
- javascript - 如何在不打开打印对话框的情况下使用 google chrome 中的 javascript 进行打印?
- php - 加入的表不返回任何结果
- python - 这对清理测试数据很重要吗?
- java - 在 JAX-RS 端点上预热 JSON 序列化程序
- c - 如何为 Thread 设置计时器