typescript - 输入选项的基本返回类型
问题描述
AFile
可以content
设置为 astring
或 aBuffer
取决于是否设置了编码选项。
我试图重载这个函数以获得根据输入确定结果的能力。
async function readFromFileQuery (fq: Merge<FileQuery, { encoding: FileEncodings }>): Promise<Merge<File, { content: string }>>;
async function readFromFileQuery (fq: Merge<FileQuery, { encoding: null }>): Promise<Merge<File, { content: Buffer }>>;
async function readFromFileQuery (fq: FileQuery): Promise<File> {
const { path, encoding, flag } = FileQueryHandler.make(fq);
const content = await promisify(fs.readFile)(path, { encoding, flag })
return { path, encoding, flag, content };
}
readFromFileQuery({ path: './File.ts', encoding: FileEncodings.UTF8 }).then(r => {
console.log(r);
});
如何在 TypeScript 中实现这一点?
解决方案
不确定您的所有类型是什么,但如果参数类型的形状在重载之间不兼容,您可以轻松地重载参数。
这按预期工作
import { promisify } from "util";
import * as fs from 'fs'
async function readFromFileQuery(fq: Merge<FileQuery, { encoding: FileEncodings }>): Promise<Merge<File, { content: string }>>;
async function readFromFileQuery (fq: Merge<FileQuery, { encoding?: null | undefined}>): Promise<Merge<File, { content: Buffer }>>;
async function readFromFileQuery (fq: FileQuery): Promise<File> {
const { path, encoding, flag } = FileQueryHandler.make(fq);
const content = await promisify(fs.readFile)(path, { encoding, flag })
return { path, encoding: encoding as FileEncodings, flag, content };
}
readFromFileQuery({ path: './File.ts', encoding: FileEncodings.UTF8 }).then(r => {
console.log(r.content); // string
});
readFromFileQuery({ path: './File.ts' }).then(r => {
console.log(r.content); // Buffer
});
readFromFileQuery({ path: './File.ts', encoding: null }).then(r => {
console.log(r.content); // Buffer
});
// Some assumptions
type Merge<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U
enum FileEncodings {
UTF8 ="UTF8"
}
interface FileQuery {
path: string, flag?: string, encoding?: FileEncodings | null
}
export interface File {
path: string, flag?: string, encoding: string, content: Buffer | string
}
declare var FileQueryHandler: {
make(fq: FileQuery) : FileQuery
}
推荐阅读
- angular - 过滤数组 angular 4 中的两个对象,id 和 date
- javascript - 使用 ReadonlyMap
类型 - python - 我明白为什么我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str
- php - 如何从此代码发送电子邮件,我正在尝试从 localhost xampp 服务器发送电子邮件
- php - Wordpress while 循环仅从自定义分类中获取特定术语
- javascript - Materialize - 使用 ajax 更改数据时自动完成隐藏
- android - 使用 gradle 构建脚本从资产目录中排除文件以进行发布构建
- sql - 连接具有不同变量名称的两个表
- ios - 如何在 UINavigation 和 UITabBar 之上绘制覆盖视图
- javascript - 将 javascript 函数动态添加到 Angular 项目中