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

Relaterade artiklar