javascript - Generera ett const-typat objekt i TypeScript
Jag försöker generera ett const-typat objekt genom att skicka in en sträng som jag vill använda som typ, är det möjligt, jag har provat nedanstående och det ger fel typ.
const test = <T> (name: T) => {
const hi: { name: T } = {
name
} as const
return hi
}
const test1 = test('hello')
Jag skulle vilja att detta är av typen
{
name: 'hello';
}
Men istället är det av typen
{
name: string;
}
Svar #1
För att kunna härleda den bokstavliga typen av ett argument, behöver du vanligtvis lägga till en lämplig begränsning på ditt generiska argument. Se detta exempel:
function test<T extends string>(name: T) {
return { name };
}
const test1 = test('hello') // {name:"hello"}
Om du är intresserad av fler exempel kan du kolla på min artikel
Om du vill lägga till någon validering kan du använda en villkorlig typ:
// Forbids using underscore as a prefix
type IsAllowed<T extends string> = T extends `_${string}` ? never : T
function foo<T extends string>(name: IsAllowed<T>) {
return { name };
}
const test1 = foo('hello') // ok
const test2 = foo('_hello') // expected error
Eller så kan du använda denna verktygstyp :
type IsLiteral<T extends string> = T extends string ? string extends T ? never : T : never
function test<T extends string>(name: IsLiteral<T>) {
return { name };
}
Om du bara vill tillåta strängliteraler
