我在使用具有多種承諾回傳型別的型別斷言時遇到了麻煩。這是代碼的精簡版本:
interface SimpleResponseType {
key1: string
};
interface SimpleResponseType2 {
property1: string
property2: number
};
interface ServiceType {
fetchResponse: () => Promise<SimpleResponseType | SimpleResponseType2>
};
class Service implements ServiceType {
async fetchResponse() {
// code to fetch some api data and return some json
// just return a pretend/sample response
return { key1: 'json' };
};
};
const service = new Service();
await service.fetchResponse().then(resp => {
// Should be typeof SimpleResponseType
console.log(resp.key1)
})
TypeScript 將在最后一個下劃線key1并拋出此錯誤:
Property 'key1' does not exist on type 'SimpleResponseType2'.ts(2339)
這是有道理的,但是當我嘗試斷言型別時,會出現更多錯誤。例如像這樣斷言它:
await service.fetchResponse().then((resp as SimpleResponseType) => {
它拋出這個錯誤:
Argument of type 'SimpleResponseType' is not assignable to parameter of type '(value: SimpleResponseType | SimpleResponseType2) => SimpleResponseType | SimpleResponseType2 | PromiseLike<...>'.
Type 'SimpleResponseType' provides no match for the signature '(value: SimpleResponseType | SimpleResponseType2): SimpleResponseType | SimpleResponseType2
我能得到的唯一斷言是這樣的:
const respTyped = resp as SimpleResponseType
然后使用respTyped代替resp.
也許有更好的方法來實作這一點?
uj5u.com熱心網友回復:
return { key1 = 'json' };
看起來你在做一些奇怪的事情。如果您鍵入:
return { key1: 'json' };
uj5u.com熱心網友回復:
您可能會使用多載。但是你需要在函式上有不同的輸入引數。我不知道您的具體情況,但對于相同的 API/函式呼叫可能有兩種不同的回傳型別似乎有點奇怪。
uj5u.com熱心網友回復:
目前尚不完全清楚您的目標是什么,但也許這就是您的目標。強烈鍵入您的服務型別,以便您知道準確的回應型別。
interface SimpleResponseType {
key1: string
};
interface SimpleResponseType2 {
property1: string
property2: number
};
interface ServiceType<T extends SimpleResponseType | SimpleResponseType2> {
fetchResponse: () => Promise<T>
};
class Service implements ServiceType<SimpleResponseType> {
async fetchResponse() {
// code to fetch some api data and return some json
// just return a pretend/sample response
return { key1: 'json' };
};
};
const service = new Service();
export {}
await service.fetchResponse().then(resp => {
// Should be typeof SimpleResponseType
console.log(resp.key1)
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487207.html
標籤:javascript 打字稿 承诺
上一篇:REACT組件呈現然后消失
