Typescript 基于输入选项的基本返回类型
Typescript 基于输入选项的基本返回类型,typescript,Typescript,文件可以将内容设置为字符串或缓冲区,具体取决于是否设置了编码选项 我试图重载此函数,以获得根据输入确定结果的能力 async function readFromFileQuery (fq: Merge<FileQuery, { encoding: FileEncodings }>): Promise<Merge<File, { content: string }>>; async function readFromFileQuery (fq: Merge<
文件
可以将内容
设置为字符串
或缓冲区
,具体取决于是否设置了编码选项
我试图重载此函数,以获得根据输入确定结果的能力
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);
});
异步函数readFromFileQuery(fq:Merge):Promise;
异步函数readFromFileQuery(fq:Merge):承诺;
异步函数readFromFileQuery(fq:FileQuery):承诺{
const{path,encoding,flag}=FileQueryHandler.make(fq);
const content=await promisify(fs.readFile)(路径,{encoding,flag})
返回{path,encoding,flag,content};
}
readFromFileQuery({path:'./File.ts',编码:FileEncodings.UTF8})。然后(r=>{
控制台日志(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
}
从“util”导入{promisify};
将*作为fs从“fs”导入
异步函数readFromFileQuery(fq:Merge):承诺;
异步函数readFromFileQuery(fq:Merge):承诺;
异步函数readFromFileQuery(fq:FileQuery):承诺{
const{path,encoding,flag}=FileQueryHandler.make(fq);
const content=await promisify(fs.readFile)(路径,{encoding,flag})
返回{path,encoding:编码为FileEncodings,flag,content};
}
readFromFileQuery({path:'./File.ts',编码:FileEncodings.UTF8})。然后(r=>{
console.log(r.content);//字符串
});
readFromFileQuery({path:'./File.ts'})。然后(r=>{
console.log(r.content);//缓冲区
});
readFromFileQuery({path:'./File.ts',编码:null})。然后(r=>{
console.log(r.content);//缓冲区
});
//一些假设
类型Merge=Pick&U
枚举文件编码{
UTF8=“UTF8”
}
接口文件查询{
路径:字符串,标志?:字符串,编码?:文件编码|空
}
导出接口文件{
路径:字符串,标志?:字符串,编码:字符串,内容:缓冲区|字符串
}
声明var FileQueryHandler:{
make(fq:FileQuery):FileQuery
}