首页 > 解决方案 > 在打字稿中,我不明白为什么会收到错误“Service1 | 服务2 | null' 不可分配给类型 '(Service1 & Service2) | 无效的'

问题描述

我正在尝试为一个简单的个人应用程序创建一个“婴儿”IoC 容器。我试图用这段代码实现的是根据作为第一个参数传递的键service在方法中为参数定义一个类型registerService

但我得到了错误

Type 'Service1 | Service2 | null' is not assignable to type '(Service1 & Service2) | null'.
  Type 'Service1' is not assignable to type 'Service1 & Service2'.
    Property 'thing2' is missing in type 'Service1' but required in type 'Service2'.

我的代码:

export const SERVICE_ONE_KEY = 'service1'
export const SERVICE_TWO_KEY = 'service2'

type Service1 = {
  thing1: () => void
}

type Service2 = {
  thing2: () => void
}

type IocKeys = typeof SERVICE_ONE_KEY | typeof SERVICE_TWO_KEY
type Services = {
  [SERVICE_ONE_KEY]: Service1 | null
  [SERVICE_TWO_KEY]: Service2 | null
}

const registry: Services = {
  service1: null,
  service2: null
}

export const registerService = (name: IocKeys, service: Services[typeof name]): Services[typeof name] => {
  registry[name] = service // Error here
  return registry[name]
}

export const getService = (name: IocKeys): Services[typeof name] => {
    return registry[name]
}

可以在这里尝试一个“工作”示例来了解什么是错的!

更新 1

我还想根据getService方法中的名称参数键定义返回类型

标签: typescripttypescript-typings

解决方案


这可以使用泛型来实现:

export const registerService = <T extends IocKeys>(name: T, service: Services[T]): Services[T] => {
  registry[name] = service
  return registry[name]
}

export const getService = <T extends IocKeys>(name: T): Services[T] => {
  return registry[name]
}

操场


推荐阅读