У меня есть функция createModule
, которая просто возвращает свой параметр:
function createModule(obj) {
return obj
}
Возвращаемое значение должно иметь именно тот тип, который выводится из параметра:
interface Mod1State {
p1: string
}
const mod1 = createModule({
namespaced: true,
state: {
p1: "abc"
} as Mod1State,
mutations: {
SET_P1(state, p1: string) {
state.p1 = p1
}
}
} as const)
// 'mod1' must be of type: '{ namespaced: true, state: Mod1State, mutations: { SET_P1(state: any, p1: string): void } }'
Пока все просто:
function createModule<T>(obj: T): T {
return obj
}
Теперь я хотел бы добавить автозаполнение в параметр state
из SET_P1
. И я бы предпочел проверить свойство state
вместо его приведения.
SET_P1(state, p1: string) {
// Here, 'state' should be of type Mod1State
}
Вот что я пробовал:
function createModule<S, T extends WithState<S> = WithState<S>>(obj: VuexModule<T, S>): T {
return obj
}
interface WithState<S> {
state?: S
}
type VuexModule<T extends WithState<S>, S = T["state"]> = T & {
namespaced?: boolean
state?: S
mutations?: {
[K: string]: (state: S, payload: any) => void
}
}
Это работает только если я удалю as const
(я не понимаю, почему):
const mod1 = createModule<Mod1State>({
namespaced: true,
state: { // Good: the type of 'state' is checked
p1: "abc"
},
mutations: {
SET_P1(state, p1: string) { // Good: 'state' is of type 'Mod1State'
state.p1 = p1
}
}
})
Но mod1
теперь относится к типу WithState<Mod1State>
. Предполагаемый тип теряется. Как восстановить точный тип параметра createModule для типа возвращаемого значения?
See also: the example in the playground .
EDIT: I obtained something with a code взято из моего примера. Я даже не понимаю, как это работает. И почему тип namespaced
выводится как true
вместо boolean
без as const
.
noImplicitAny
). Также я не могу воспроизвести, чтоstate
имеет типMod1State
(это все ещеany
). - person ford04   schedule 03.12.2019Good: 'state' is of type 'Mod1State'
; Я получаю неявную ошибку. see. - person jcalz   schedule 03.12.2019as const
. Это еще одна проблема, потому что мне нужноas const
. - person Paleo   schedule 03.12.2019