【发布时间】:2018-10-29 11:13:04
【问题描述】:
我有一个类型谓词:
// tslint:disable-next-line:no-any
const isString = (value: any): value is string {
return typeof value === 'string'
}
这可行,但它要求我禁用我的 linter。我宁愿这样做:
const isString = <T>(value: T): value is string {
return typeof value === 'string'
}
这样类型不是any,而是每个类型都有一个类型保护函数,即每个a一个函数a -> Boolean。
Typescript 抱怨说:
类型谓词的类型必须可分配给其参数的类型。 类型“字符串”不可分配给类型“T”。
这对我来说没有意义......为什么类型谓词的类型很重要?
【问题讨论】:
-
您可以改用
(value: {}): value is string => { ... }。至于错误,很奇怪;似乎倒退了。T需要分配给string对我来说更有意义。例如,TypeScript 应该知道Date永远不会分配给string,所以这样的谓词没有意义。 -
嗯...但是允许我们使用
(value: any) => value is string作为类型谓词更糟糕,对吧?如果我愿意,我可以给它一个Date。 -
有点不同。使用
T更像是编写一大堆函数。尝试编写一个用户定义的类型保护,如(value: Date): value is string => { ... },你就会明白我的意思了。 -
好点,泛型的意思是“给我每个函数中的一个
a -> Boolean”,所以如果这些函数中的任何一个不存在,那么泛型就不存在。好的!你能写一个答案吗?
标签: typescript