2016-09-24 71 views
2

在打字稿2.0,为什么我不能有一个功能型后卫:TypeScript 2.0方法类型的警卫?

function hasValue<T>(value: T | undefined): value is T { return value !== undefined; } 

但不是方法型后卫?:

export class Maybe<T> { 
    constructor(public value: T | undefined) {} 

    hasValue(): this.value is T { return this.value !== undefined; } 
} 

错误的hasValue()

'{'或';'预期。

+0

这是否与TypeScript 2.0相关?无论如何,“T中的值”中的标识符必须是范围内的某个标识符,例如参数。无论守卫是在一个功能还是一个方法上,这都是正确的。你可以把你的警卫写成'hasValue (value)的值是T {return value!== undefined; }',并将其称为'if(this.hasValue(this.value))...'。 – 2016-09-24 02:55:41

回答

2

这里有几个问题:

1)在声明返回类型,那么它作为polymorphic this type,而不是作为类的实例的引用时使用this

2)The docs on this matter清楚说明:

谓词的形式为参数名称是类型,其中参数名称 必须从当前的函数签名的参数的名称。

如果使用this.parameterName那么它不是“来自当前函数签名的参数”。
你可以争辩说,他们可以添加它,但是:

3)类型警卫是检查类型而不是变量的函数。
由于类型本身不是类的一部分,因此类型守护函数也不会成为类的一部分。