typescript - 类型保护不适用于通用参数?
问题描述
例子:
type SomeType = {
foo: string;
} | undefined;
function someFn<TParams extends SomeType>(params1: SomeType, params2: TParams): void {
if (params1) {
Object.entries(params1);
}
if (params2) {
Object.entries(params2); // here is an error
}
}
TypeScript 无法确定params2
不包含未定义。对此有合理的解释,还是 TypeScript 中的错误?
在线演示在这里
解决方案
这是打字稿中的一个未解决的问题(https://github.com/microsoft/TypeScript/issues/4742)。自动类型保护和泛型并不总是一起工作。作为一种可能的解决方法,您可以手动定义此类型保护:
type SomeType = {
foo: string;
} | undefined;
function isDefined<T> (v: T): v is Exclude<T, undefined> {
return v !== undefined
}
function someFn<TParams extends SomeType>(params1: SomeType, params2: TParams): void {
if (params1) {
Object.entries(params1);
}
if (isDefined(params2)) {
Object.entries(params2);
}
}
推荐阅读
- javascript - 从 1 开始每个 jquery
- python - 将函数的结果附加到列表中
- laravel - 我是 laravel 的新手,我想在主页上宣布
- mysql - SQL - 如果 col1 的值期望为 0 并且 col2 的值除了 0 之外,col3 的值相同,那么一行中的值
- sql - 如何在不更改存储过程本身的情况下将动态存储过程的结果(带输入参数)插入临时表
- javascript - 响应式汉堡菜单不适用于移动 Safari
- c# - 绑定属性即将为空
- sql - 使用计算列选择和分组的 SQL Server 问题
- dart - 如何根据文本大小扩展文本和容器?
- mysql - 使用 MySQL 的 Docker 中的隐式每个容器存储