[Typescript] Constraint inputs types
const returnsValueOnly = <T>(t: T) => {
return t;
}
const result = returnsValueOnly("a"); // const returnsValueOnly: <"a">(t: "a") => "a"
const returnsValueInAnObject = <T1>(t: T1) => {
return {
t,
};
};
const result2 = returnsValueInAnObject("abc");
/**
const result2: {
t: string;
}
*/
// With a constraint, it narrows it to its literal
const returnsValueInAnObjectWithConstraint = <T1 extends string>(t: T1) => {
return {
t,
};
};
const result3 = returnsValueInAnObjectWithConstraint("abc");
// With a constraint, it narrows it to its literal
const returnsValueInAnObjectWithConstraint2 = <const T1>(t: T1) => {
return {
t,
};
};
const result31 = returnsValueInAnObjectWithConstraint("abc");
/*
const result3: {
t: "abc";
}
*/
const acceptsValueInAnObject = <T>(obj: { input: T }) => {
return obj.input;
};
const result4 = acceptsValueInAnObject({ input: "abc" }); //string
const acceptsValueInAnObjectFieldWithConstraint = <T extends string>(obj: {
input: T;
}) => {
return obj.input;
};
const result5 = acceptsValueInAnObjectFieldWithConstraint({ input: "abc" });
/*
const acceptsValueInAnObjectFieldWithConstraint: <"abc">(obj: {
input: "abc";
}) => "abc"
*/
const acceptsValueWithObjectConstraint = <
T extends {
input: string;
},
>(
obj: T,
) => {
return obj.input;
};
const result7 = acceptsValueWithObjectConstraint({ input: "abc" });
const result4WithAsConst = acceptsValueWithObjectConstraint({
input: "abc",
} as const);