Переписывать `any` в TypeScript при объединении интерфейсов - PullRequest
2 голосов
/ 26 марта 2019

Я использую Express и пытаюсь явно определить res.locals.В пакете @ types / express значение Express.Response.locals равно any, поэтому я не могу перезаписать его:

types / express / index.d.ts:

declare namespace Express {
  interface Response {
    locals: {
      myVar: number
    }
  }
}

Мое промежуточное ПО:

import * as express from 'express'

function middleware(
  req: express.Request, 
  res: express.Response, 
  next: express.nextFunction
) {
  res.locals.myVar = '10' // I want this to throw a compiler error
  next()
}

Я хочу, чтобы мое неправильное назначение res.locals.myVar было ошибкой, но res.locals по-прежнему any в соответствии с моим автозаполнением.

Как я могуудалить any и полностью заменить его?

1 Ответ

2 голосов
/ 26 марта 2019

К сожалению, нет способа переопределить любое использование интерфейса слияния.Вы можете сделать некоторые операции над типом и заменить тип, используя сопоставленные и условные типы:

import * as express from 'express'

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

type MyResponse = Omit<express.Response, "locals"> & { 
  locals: {
    myVar: number
  }
}
function middleware(
  req: express.Request, 
  res: MyResponse, 
  next: express.NextFunction
) {
  res.locals.myVar = '10' // error now
  next()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...