Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 基于输入选项的基本返回类型_Typescript - Fatal编程技术网

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
}