甲File
可以有content
设定为string
或取决于如果编码选项设置一个Buffer
。
我试图重载这个函数来获得,以确定哪些结果会根据输入的能力。
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);
});
我怎样才能在打字稿实现这一目标?
不知道你所有的类型,但你可以很容易地在一个参数重载如果参数类型的形状是重载之间不兼容。
这按预期工作
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
}