typescript how to use type guard for key-value
up vote
1
down vote
favorite
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>
}
}
That's my code, but the return type of colname
always Dictory<string>
whatever pass any type, how should I correctly use type guard for key-value
typescript
add a comment |
up vote
1
down vote
favorite
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>
}
}
That's my code, but the return type of colname
always Dictory<string>
whatever pass any type, how should I correctly use type guard for key-value
typescript
Could you provide the specific values you are passing and where the actual result differs from your expected result?
– Sefe
yesterday
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
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>
}
}
That's my code, but the return type of colname
always Dictory<string>
whatever pass any type, how should I correctly use type guard for key-value
typescript
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>
}
}
That's my code, but the return type of colname
always Dictory<string>
whatever pass any type, how should I correctly use type guard for key-value
typescript
typescript
asked yesterday
s97712
156
156
Could you provide the specific values you are passing and where the actual result differs from your expected result?
– Sefe
yesterday
add a comment |
Could you provide the specific values you are passing and where the actual result differs from your expected result?
– Sefe
yesterday
Could you provide the specific values you are passing and where the actual result differs from your expected result?
– Sefe
yesterday
Could you provide the specific values you are passing and where the actual result differs from your expected result?
– Sefe
yesterday
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
The problem is not with the type guard. If you want the function to return a value of the same type you will either need to have multiple overloads, or a type parameter that captures the actual type of the parameter and return the same type parameter:
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; }
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
The problem is not with the type guard. If you want the function to return a value of the same type you will either need to have multiple overloads, or a type parameter that captures the actual type of the parameter and return the same type parameter:
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; }
add a comment |
up vote
1
down vote
The problem is not with the type guard. If you want the function to return a value of the same type you will either need to have multiple overloads, or a type parameter that captures the actual type of the parameter and return the same type parameter:
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; }
add a comment |
up vote
1
down vote
up vote
1
down vote
The problem is not with the type guard. If you want the function to return a value of the same type you will either need to have multiple overloads, or a type parameter that captures the actual type of the parameter and return the same type parameter:
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; }
The problem is not with the type guard. If you want the function to return a value of the same type you will either need to have multiple overloads, or a type parameter that captures the actual type of the parameter and return the same type parameter:
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; }
answered yesterday
Titian Cernicova-Dragomir
51.9k33148
51.9k33148
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53372216%2ftypescript-how-to-use-type-guard-for-key-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Could you provide the specific values you are passing and where the actual result differs from your expected result?
– Sefe
yesterday