2017-09-01 37 views
3

我有一個接口這個簽名有什麼問題? (打字稿-2.5)

export interface ITypeAssertions 
    { 
     isOfTypeElseFail<TExpected extends TActual, TActual>(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected; 
    } 

和實施

export class NodeJsTestingFrameworkAdapter implements ITypeAssertions 
{ 
    isOfTypeElseFail<TExpected extends TActual, TActual>(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected 
    { 
     throw new Error("Method not implemented."); 
    } 
} 

編譯器抱怨說:

  • 接口 - 不正確實施

    • (...)

      • 類型謂詞 '值是觸覺' 不是分配給 '值 TExpected'
        • 類型 '觸覺' 是不能分配給輸入 'TExpected'

怎麼回事?這是類型檢查器中的錯誤嗎?

PS。它在Ts-2.3下正在編譯。

+0

我猜你真的想要返回值是一個類型的警衛,如果我改變它返回布爾它適用於我 –

+0

@ TitianCernicova-Dragomir但改變返回值從'值是T'to'bool'使得它不像OP那樣是一個普通的類型守衛,是嗎? – Pac0

+1

版本2.4引入了更嚴格的泛型類型推斷,這可能導致該問題。不幸的是,我很難理解爲什麼會發生這種情況。更奇怪的是,它沒有用戶定義的類型警衛。我會建議在官方的TypeScript存儲庫中提交一個問題。 –

回答

1

目前沒有機會使其工作,如在github.com/Microsoft/TypeScript/issues/18202下的響應中所述。

+0

。實際上,它確實讓我放心了一點。我努力去理解它如何在沒有一些「太鬆散」的編譯檢查的情況下實際工作。 +1直接回購語言的權威答案。 – Pac0

0

你要小心界定interface(而不是接口方法)和class(而不是接口的實現方法)作爲通用:

interface ITypeAssertions<TActual, TExpected extends TActual> 
{ 
    isOfTypeElseFail(value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected; 
} 

export class NodeJsTestingFrameworkAdapter<TActual, TExpected extends TActual> implements ITypeAssertions<TActual, TExpected> 
{ 
    isOfTypeElseFail (value: TActual, oxIsOfType: (xVal: TActual) => boolean): value is TExpected 
    { 
     return true; 
    } 
} 

這編譯的Typescript playground

不幸的是,根據你的評論,這不是你想要的,因爲它迫使你用每一對類型來實現類。

+0

但事情是我不希望整個類型被參數化;這將導致我實現我想要測試的每種類型的對象的接口。我需要(測試人員:ITypeAssertions = ...),(測試人員:ITypeAssertions = ...)等等。正如我所提到的,它曾經用於Ts-2.3。確實是 – user3284063