扩展嵌套的打字稿接口
Extend nested typescript interface
我有一些复杂的打字稿类型,它们是用代码生成器创建的,我希望能够使用这些类型的一部分而不必重新定义整个类型。
例如,我生成的界面可能如下所示(大量简化)
type Transportation = {
vehicle: {
truck: {...}
car: {
make: string
model: string
weight: string
...
}
}
boat: {...}
...
}
现在假设我正在编写一个函数,它接收汽车并用它做一些事情
/* This type won't work, I'm asking if there is a proper way to do this*/
processCar(car: Transportation.vehicle.car) {
//TODO: process the car
}
const transport: Transportation = {...}
processCar(transport.vehicle.car)
有没有一种方法可以基于现有类型的一部分创建类型,而不必将整个汽车项目定义为自己的类型或接口?它可以用接口或其他东西扩展吗?谢谢!
对于上下文,我生成的复杂类型来自 graphql code generator。可以对其进行一些自定义,但不幸的是,我不知道有什么方法可以让它在漂亮的分隔界面中生成所有内容。
使用交通工具['Vehicle']['Car'] 就可以了。
更好的输入方式是,如果类型是可访问的,那么您可以按如下方式使用它们。
你可以像这样使用命名空间
namespace Transportation {
export namespace Vehicle {
export interface Car {
make: string;
model: string;
weight: string;
...
};
export interface Truck {
make: string;
model: string;
weight: string;
...
}
}
export interface Boat {
...
}
}
let car: Transportation.Vehicle.Car;
但老实说,这种方法似乎并不是最好的情况。
通常你会只使用一个命名空间并将你需要的每个接口导出到外部。
namespace Transportation {
//note, that the Vehicle isn't exported
interface Vehicle {
make: string;
model: string;
weight: string;
...
}
export interface Car extends Vehicle {
doors: number;
}
export interface Truck extends Vehicle {
transportmass: number;
}
export interface Boat {
...
}
}
//let car: Transportation.Vehicle.Car; this won't work anymore
//let vehicle: Transportaion.Vehicle; won't work either
let car: Transportation.Car;
我有一些复杂的打字稿类型,它们是用代码生成器创建的,我希望能够使用这些类型的一部分而不必重新定义整个类型。
例如,我生成的界面可能如下所示(大量简化)
type Transportation = {
vehicle: {
truck: {...}
car: {
make: string
model: string
weight: string
...
}
}
boat: {...}
...
}
现在假设我正在编写一个函数,它接收汽车并用它做一些事情
/* This type won't work, I'm asking if there is a proper way to do this*/
processCar(car: Transportation.vehicle.car) {
//TODO: process the car
}
const transport: Transportation = {...}
processCar(transport.vehicle.car)
有没有一种方法可以基于现有类型的一部分创建类型,而不必将整个汽车项目定义为自己的类型或接口?它可以用接口或其他东西扩展吗?谢谢!
对于上下文,我生成的复杂类型来自 graphql code generator。可以对其进行一些自定义,但不幸的是,我不知道有什么方法可以让它在漂亮的分隔界面中生成所有内容。
使用交通工具['Vehicle']['Car'] 就可以了。
更好的输入方式是,如果类型是可访问的,那么您可以按如下方式使用它们。
你可以像这样使用命名空间
namespace Transportation {
export namespace Vehicle {
export interface Car {
make: string;
model: string;
weight: string;
...
};
export interface Truck {
make: string;
model: string;
weight: string;
...
}
}
export interface Boat {
...
}
}
let car: Transportation.Vehicle.Car;
但老实说,这种方法似乎并不是最好的情况。
通常你会只使用一个命名空间并将你需要的每个接口导出到外部。
namespace Transportation {
//note, that the Vehicle isn't exported
interface Vehicle {
make: string;
model: string;
weight: string;
...
}
export interface Car extends Vehicle {
doors: number;
}
export interface Truck extends Vehicle {
transportmass: number;
}
export interface Boat {
...
}
}
//let car: Transportation.Vehicle.Car; this won't work anymore
//let vehicle: Transportaion.Vehicle; won't work either
let car: Transportation.Car;