2017-05-26 53 views
1

TypeScript 2.3.3。函數接口中的意外類型推斷

{ 
    interface F { <T extends string = string>(x: T): T } 
    const f: F = x => 1; // test failed: an error was expected 
}{ 
    interface F<T extends string = string> { (x: T): T } 
    const f: F = x => 1; // test passed: an error as expected 
} 

請問有人可以解釋這種行爲嗎?

+0

我得到在這兩種情況下的錯誤..因爲你不能一個號碼分配給一個字符串。類型F的函數(在這兩種情況下)都會返回一個字符串。 – toskv

+0

@toskv,我在第二個(TS 2.3.3)中得到一個錯誤。順便說一下,我簡化了這個例子。 – dizel3d

+0

我用簡化的方法試過了,它是一樣的。 – toskv

回答

1

你得到

interface F<T extends string> { (x: T): T } 
const f: F = x => 1; // Error: Generic argument was expected 

已經什麼都沒有做的事實,該函數返回一個number錯誤。

如果你確實抑制了類型錯誤:

interface F<T extends string> { (x: T): T } 
const f: F<any> = x => 1; // test failed: an error was expected 

你可以看到爲什麼第一種情況未示數。通用被推斷爲any,因此any => any容易被函數納any => number

interface F { <T extends string = string>(x: T): T } 
const f: F = x => 1; // No error cause `any` => `number` is valid for `any` => `any`