能否在类型守卫中使用泛型作为类型谓词?
能否在类型守卫中使用泛型作为类型谓词?
你这段代码报错的核心是:当把返回boolean的函数赋值给TypeValidator<string>类型变量时,TypeScript没法自动把这个布尔返回值和input is string类型谓词关联起来——泛型类型只是定义了目标结构,但函数本身的签名里没有明确声明类型谓词。
修正方案
你需要在具体的函数实现里显式写出类型谓词,而不是只依赖泛型类型约束,修正后的代码如下:
type TypeValidator<T> = (input: unknown) => input is T; // 显式在函数签名中声明类型谓词 const isString: TypeValidator<string> = (input): input is string => typeof input === 'string';
也可以用泛型函数封装的方式,让TypeScript自动推断关联关系:
type TypeValidator<T> = (input: unknown) => input is T; function createValidator<T>(check: (input: unknown) => boolean): TypeValidator<T> { return (input): input is T => check(input); } // 传入泛型参数,直接生成类型守卫 const isString = createValidator<string>((input) => typeof input === 'string');
这两种写法都能让TypeScript正确识别函数是符合泛型类型的类型守卫,解决赋值时的类型不匹配错误。
内容的提问来源于stack exchange,提问作者Matthew Blewitt
相关产品推荐
相关产品推荐

