typescript - Omit<keyof typeof SomeObject, "omittedKey"> inkluderar Array-prototypens nycklar
I Redux Toolkit har jag en slice som mest består av sträng-arrayer, och jag vill ha en åtgärd som lägger till en sträng i en av arrayerna. Åtgärden ska ta nyckeln till arrayen som ska läggas till, samt strängen som ska läggas till.
Här är hur jag har skrivit det:
const initialState = {
gameModes: [] as string[],
contestTypes: [] as string[],
entryFee: {
max: 10000,
min: 0,
},
entryTypes: [] as string[],
advancedFilters: [] as string[],
};
type ContestFilterSliceType = typeof initialState;
type ContestFilterKey = keyof ContestFilterKey;
const contestFilterSlice = createSlice({
name: "constestFilter",
initialState,
reducers: {
addFilter(
state,
action: PayloadAction<{ key: Omit<ContestFilterKey, "entryFee">; filter: string }>
) {
const { filter, key } = action.payload;
state[key].push(filter);
},
},
});
När jag hovrar över type ContestFilterKey=keyof ContestFilterKey;, ser jag att typen, korrekt, är en lista över nycklarna i initialState.
Men när jag hovrar över key: Omit<ContestFilterKey, "entryFee">, får jag detta:
nyckel: Välj<"gameModes" | "contestTypes" | "entryFee" | "entryTypes" | "advancedFilters", number | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | ... 40 till ... | "replaceAll">
Det verkar som att den senare inkluderar en hel massa prototypmetoder. Av Array? Av Object? Oklart.
Jag skulle förvänta mig att Omit<ContestFilterKey, "entryFee"> helt enkelt är: "gameModes" | "contestTypes" | "entryTypes" | "advancedFilters"
Vad missar jag här?
Svar #1
Okej, en snabb RTFM visade att den verktygstyp jag letade efter inte var Omit, utan Exclude.
Lämnar detta här för nästa dumbom som gör detta misstag.