2016-09-24 37 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)類型警衛是檢查類型而不是變量的函數。
由於類型本身不是類的一部分,因此類型守護函數也不會成爲類的一部分。