type Dircory<T> {
[key:string]: T
}
function colname(columns:Array<string> | string| Dictory<string>, name){
if(Array.isArray(columns){
return columns.map(column=>table_name + "." + columns);
}else if(typeof columns == "string"){
return table_name + "." + columns;
}else if(typeof columns == "object"){
return columns as Dictory<string>
}
}这是我的代码,但是colname的返回类型总是Dictory<string>,无论传递什么类型,我应该如何正确地使用键值的类型保护
发布于 2018-11-19 18:11:11
问题不在于类型保护。如果希望函数返回相同类型的值,则需要具有多个重载,或者使用一个类型参数来捕获参数的实际类型并返回相同的类型参数:
type Dircory<T> = {
[key: string]: T
}
let table_name;
function colname<T extends Array<string> | string | Dircory<string>>(columns: T, name: string) :T
function colname(columns: Array<string> | string | Dircory<string>, name) {
if (Array.isArray(columns)) {
return columns.map(column => table_name + "." + columns);
} else if (typeof columns == "string") {
return table_name + "." + columns;
} else if (typeof columns == "object") {
return columns as Dircory<string>
}
}
let a = colname("A", ""); // string, actually the string literal type "A", but will work with strnig vars too
let arr = colname(["A"], ""); // string[]
let d = colname({a: "A"}, ""); // { a: string; }https://stackoverflow.com/questions/53372216
复制相似问题