我有一個像這樣的物件陣列
type AnyType = {
name: 'A' | 'B' | 'C';
isAny:boolean;
};
const myArray :AnyType[] =[
{name:'A',isAny:true},
{name:'B',isAny:false},
]
我想運行在myArray與reduce以獲取名稱陣列只
const namesArray=myArray.reduce<AnyType['name'][]>((a,b)=>{
return b.name;
},[])
但我收到打字稿錯誤
(parameter) b: AnyType
BugFinder: No overload matches this call.BugFinder:
Overload 1 of 6, '(callbackfn: (previousValue: ("A" | "B" | "C")[], currentValue: AnyType, currentIndex: number, array: AnyType[]) => ("A" | "B" | "C")[], initialValue: ("A" | "B" | "C")[]): ("A" | ... 1 more ... | "C")[]', gave the following error.BugFinder:
Argument of type '(a: ("A" | "B" | "C")[], b: AnyType) => "A" | "B" | "C"' is not assignable to parameter of type '(previousValue: ("A" | "B" | "C")[], currentValue: AnyType, currentIndex: number, array: AnyType[]) => ("A" | "B" | "C")[]'.BugFinder:
Type '"A" | "B" | "C"' is not assignable to type '("A" | "B" | "C")[]'.BugFinder:
Type '"A"' is not assignable to type '("A" | "B" | "C")[]'.BugFinder:
Overload 2 of 6, '(callbackfn: (previousValue: ("A" | "B" | "C")[], currentValue: AnyType, currentIndex: number, array: AnyType[]) => ("A" | "B" | "C")[], initialValue: ("A" | "B" | "C")[]): ("A" | ... 1 more ... | "C")[]', gave the following error.BugFinder:
Argument of type '(a: ("A" | "B" | "C")[], b: AnyType) => "A" | "B" | "C"' is not assignable to parameter of type '(previousValue: ("A" | "B" | "C")[], currentValue: AnyType, currentIndex: number, array: AnyType[]) => ("A" | "B" | "C")[]'.BugFinder:
Type '"A" | "B" | "C"' is not assignable to type '("A" | "B" | "C")[]'.BugFinder:
Type '"A"' is not assignable to type '("A" | "B" | "C")[]'.
操場
uj5u.com熱心網友回復:
回傳值是一個陣列:
const NamesArray = myArray.reduce<AnyType["name"][]>(
(a, { name }) => [...a, name],
[]
);
另一種使用方式Array#map:
const NamesArray = myArray.map<AnyType["name"]>(({ name }) => name);
uj5u.com熱心網友回復:
如果您只想將陣列“映射”到不同的陣列,則應使用myArray.map方法;
但是如果要專門使用reduce,比方說在行程中還要過濾,那么問題就出在reducer回呼上。
減速器應該回傳 accumulator,在你的例子中它是一個名稱陣列;
這是 TS 給您的錯誤,您回傳的是(當前元素的)名稱而不是名稱陣列。
這是一個同時映射和過濾器的 reduce 示例:
const namesArray = myArray.reduce<AnyType['name'][]>( ( accumulatorArr, currentValue ) => {
if ( currentValue.isAny ) {
accumulatorArr.push( currentValue.name );
}
return accumulatorArr;
}, [] );
uj5u.com熱心網友回復:
如果你想使用 Array.reduce() 來做到這一點,那么這將很有用。但正如@majed Badawi 提到的,我們可以使用 Array.map() 輕松完成。
interface AnyType {
name: 'A' | 'B' | 'C';
isAny: boolean;
}
const myArray: AnyType[] = [
{ name: 'A', isAny: true },
{ name: 'B', isAny: false },
];
const namesArray = myArray.reduce((a, b) => {
a.push(b.name);
return a;
}, [] as string[]);
注意:我也對您的型別宣告進行了一些更改。這是我更喜歡使用它的方式。如果您喜歡這種方式,請將其更改為您的表格!
uj5u.com熱心網友回復:
嘗試這個:
const NamesArray=myArray.reduce<AnyType['name']|[]>((a:AnyType['name']|[],b:AnyType)=>{
return b.name;
},[])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334096.html
標籤:javascript 打字稿
上一篇:如何通過單擊按鈕顯示隱藏文本?
下一篇:將物件的值更改為Long
