這與基于輸入引數的 TypeScript 函式回傳型別類似,但我不明白它是如何與 Promise 一起作業的。輸入是字串或字串 [] 如果是字串則方法回傳 PlaylistEntity 否則它們的陣列
type TypeName = string | string[]
type ObjectType<T> = Promise<T extends string ? PlaylistEntity : PlaylistEntity[]>
async get<T extends TypeName>(playlists: T): ObjectType<T>{
try {
const col = collection(firestore, 'playlists')
if(Array.isArray(playlists)){
const fetchArray = playlists.slice(0, 10)
const q = query(col, where('__name__', 'in', fetchArray))
const docs = await getDocs(q)
return docs.docs.map(v => {return {id: v.id, ...v.data()} as PlaylistEntity})
}
else{
const docRef = await getDoc(doc(col, playlists))
return {id: docRef.id, ...docRef.data()} as PlaylistEntity
}
}catch (e) {
throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)
}
}
錯誤 TS2322:型別“PlaylistEntity”不可分配給型別“T 擴展字串”?播放串列物體:播放串列物體 []'。
43 回傳 {id: docRef.id, ...docRef.data()} 作為 PlaylistEntity
uj5u.com熱心網友回復:
也許函式多載可以幫助您對 TS 型別進行建模?
// Some dummy interface.
interface PlaylistEntity {
id: string
};
// When caller passes string[], returned promise resolves to PlaylistEntity[].
async function getPlaylistEntries(playlists: string[]): Promise<PlaylistEntity[]>;
// When caller passes string, returned promise resolves to PlaylistEntity.
async function getPlaylistEntries(playlists: string): Promise<PlaylistEntity>;
// Single implementation satisfying both overloads.
async function getPlaylistEntries(playlists: string | string[]) {
try {
if (Array.isArray(playlists)){
return playlists.map((p: string) => ({id: "some-id"}));
}
else{
return {id: "some-id"};
}
}catch (e) {
throw new Error();
}
}
// onePlaylistEntry inferred type is Promise<PlaylistEntity>
const onePlaylistEntry = getPlaylistEntries("a")
// arrOfPlayListEntries inferred type is Promise<PlaylistEntity[]>
const arrOfPlayListEntries = getPlaylistEntries(["a"])
在TS 操場上檢查 ^this 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490694.html
標籤:javascript 打字稿 仿制药 条件类型
下一篇:如何在函式中操作布林值?
