2017-08-01 51 views
0

我收到此錯誤爲什麼擴展接口不能分配給匹配對象的泛型類型?

[ts] Type '{ type: string; }' is not assignable to type 'A'. 

與下面的代碼

interface Action { 
    type: string; 
} 

function requestEntities<A extends Action>(type: string) { 
    return function(): A { 
     return { type }; 
    }; 
} 

爲什麼不是分配? A延伸Action,它只有一個屬性:type,這是一個字符串。這裏有什麼問題?

問題A可能有更多的屬性?那麼我如何告訴TypeScript,A仍然只有type: string屬性而沒有別的?

編輯

僅供參考,我想添加的通用A是因爲A將有特定 string類型屬性,例如原因{ string: 'FETCH_ITEMS' }

回答

2

通用不幫你在這裏。當你注意,A可以有更多的屬性:

interface SillyAction extends Action { 
    sillinessFactor: number; 
} 
requestEntities<SillyAction>('silliness'); 

有一般不打字稿的方式說一個對象有只有一些屬性集,因爲打字稿目前缺乏exact types

但在你的情況,你想返回的Action有一個type一個特定string;例如:

interface SpecificAction<T extends string> extends Action { 
    type: T; 
} 
function requestEntities<T extends string>(type: T) { 
    return function(): SpecificAction<T> { 
     return { type }; 
    }; 
} 
requestEntities('silliness'); // returns a function returning {type: 'silliness'} 

希望有幫助。祝你好運!

2

僅供參考我想添加通用A的原因是因爲A將具有特定的字符串作爲type屬性,例如, { string: 'FETCH_ITEMS' }

因爲你確信AAction兼容,你可以放心的編譯器:

return { type } as A; 
0

看什麼,你可以上,以實現更強的類型安全 做(我沒有完全理解你的任務,但該方法應該是從這個例子清楚)

interface Action { 
    type: string; 
    amount: number; 
} 

const action: Action = { type: 'type1', amount: 123 } 

function requestEntities<KEY extends keyof Action>(type: KEY) { 
    return action[type] 
} 

requestEntities('type') 
requestEntities('amount') 

requestEntities('random-stuff') 

Shows error:

相關問題